
*** Día 02/10/2025


cursom
Si acaso, certificaciones oficiales de Cisco
¿talentodigital.?

De Java a …
Tras Cobol se pasó a Pascal (Delphi es Pascal en entorno gráfico)

En los equipos que no va W11 seguramente irá Linux
Java: máquina virtual, intermediario con el SO, semicompilado (por lo que es algo más lento que los 100% compilados)

Autofirma es de Hacienda
Net Beans es un editor de código, como Eclipse o VS Code
PHP, JavaScript, Python no son compilados, sino interpretados (Python permite semicompilación)
El intérprete es más ligero que la máquina virtual Java. Sólo necesita un navegador, es independiente del SO.

CSS, HTML, JavaScript son las tecnologías que van del lado del cliente

Tras IE se pasó a usar Firefox, y ahora Chrome
Otro navegador es Tor

PHP no necesita drivers, intérpretes

La IA tira mucho de estadística y matemáticas
Hay certificaciones gratuitas de IA, parece ser

Full-Stack: quien puede desarrollar todas las fases de la aplicación

Pilas:
LAMP: Linux (SO), Apache, MySQL (base de datos), PHP, del lado del servidor
JavaScript, HTML, CSS del lado del cliente

Tensor Flow es una librería que tiene algoritmos de IA. Tiene un manual.

Los plugin añaden nuevas funcionalidades

Posibilidades salariales estimadas: de 20.000 a 28.000










*** Día 03/10/2025

https://aulavirtual.campusspainx.es/login/?lang=es


31 es Ubuntu
Ubuntu tiene desktop y server, Debian no
Debian es código 100% abierto, así que es más seguro. Es un s.o. estable, así que es muy utilizado.
También es muy utilizado Red Hat

El kernel es lo que mueve el s.o., es lo mínimo para que pueda funcionar

39: se usa el sistema de ventanas gnom

Las distribuciones Linux son parecidas, si aprendes una aprendes todas
Red Hat no es totalmente código libre, hay códigos propietario
Red Hat no cobra por la distribución, pero sí por el soporte

Ubuntu va mejor en equipos nuevos, Debian por si los tienes más antiguos
A nivel de servidor es mejor Debian, Ubuntu a nivel de escritorio

Nosotros usaremos Debian

64 es una distribución long time support (LTS)

Un .ISO es un clon del cd de instalación

https://learn.microsoft.com/es-es/cpp/windows/latest-supported-vc-redist?view=msvc-170

Nunca pasar a la zona naranja de la parte de RAM
Con 20 GB funciona, pero si podemos 50 mejor. No marcar reservar completamente para que no llegue a ese máximo, si lo marcamos destinamos siempre esos GB a esa virtual, si no sólo nos usará lo que necesite, con el tope marcado aquí como máximo

119 es importante en el aula este modo, en casa da igual, aunque es mejor el adaptador puente

148: la contraseña diferencia entre mayúsculas y minúsculas, cuidado

157: esta segunda opción es lo habitual
LVM permite agregar varios discos duros a nuestro sistema global
LVM cifrado sirve para que no puedas ver los archivos existentes si enganchas el disco duro como extraíble, por ejemplo. Sólo puedes desencriptarlo por el S.O. que los creó, que es el que conoce la clave de desencriptación
… ¿podría ser como lo que hace BitLocker sobre archivos, pero a nivel de s.o.?
Con esto el equipo se hace un poco más lento

preguntan por mi 179
183 es por si queremos agregar más software
184 nos pregunta por el repositorio

El proxy se usa como filtro de internet
205: las dos primeras no se marcarían en entorno escritorio
208 es más para equipos antiguos, mate es más como Windows... quedamos nosotros en 209

231 en nuestro caso sí, para que salte directamente Debian, si tuviéramos ya un menú/gestor de arranque le diríamos que no

Ctrl derecho + F = pantalla completa
Tecla Windows: para seleccionar cosas
244: es aconsejable tener fijado el terminal, arrastrándolo

260: si viéramos # seríamos el usuario root/superpoderoso
Tras 287 damos a Reiniciar

290: vscode no es de código abierto
303 y abrir con instalar software
324, 325, administrar temas de color
344: tomar instantánea/snapshot… es crear una nueva máquina como estaba en ese momento una anterior.
-- También tenemos la opción de Clonar

https://www.youtube.com/watch?v=1hXE8x5bwsI&list=PLSWUh43W7_OP-wIMCNZ0YlyUGVwVPGLSN&index=1
… o tal vez no sea este el vídeo


*** Día 06/10/2025


https://aulavirtual.campusspainx.es/login/?lang=es

12: sería recomendable tener una IP fija, así que es mejor contratar un servidor que esté 24/7

El plugin nos permite hacer FTP

18: busca generar la tabla de multiplicar de un número X

22: tras guardar o Ctrl+S ahí indica Done cuando el programa se ha guardado en el servidor

39 es la recomendación que nos hace al contratar esto. Windows es más caro porque hay que pagar la licencia
40 son los servidores que él tiene
46: los backups son snapshots que se hacen de forma automática
alfonso.avisando.com son subdominio, nombre de dominio y dominio

49 sirve para revisar los nombres de dominio que están libres, y poder contratarlos

El protocolo DHCP le da a cada equipo una IP diferente

55: será un servidor compartido por varios nombres de dominio
Los backups tienen un coste, como unos 0,15 al mes


64: ese firewall se encarga de abrir y cerrar puertos (por ejemplo el 25 se encarga del correo)… Es aconsejable dejar sólo abiertos los puertos que se vayan a utilizar

65: DDos son ataques por fuerza bruta, por exceso de peticiones... él no lo suele activar para sus webs, a menos que sea estrictamente necesario para nuestro trabajo

616185446?? es Caixa

Después viene algo por si tenemos varios equipos que se comuniquen entre ellos
Crea el nuevo host, le da a Enviar y llegamos a 68
80, aquí geoposicionamos la IP que le han dado

ssh es para conectar con una web... lo para con ^C...……. 91: tras reiniciar ya le va
clear borra la pantalla, pwd es para ver en qué directorio estamos, free es para consultar la distribución de memoria...
94: el servidor no está siendo muy usado
Virtualmin es gratuito... Instala muchas cosas: php, Python...

Debian y Red Hat siguen vivos
Apache es el servidor web

114 con puerto 10000 cerrado, después con él abierto
117 es un ejemplo de las diferentes configuraciones que le salen... esto, al menos por ahora, no lo tendremos que hacer nosotros

https://alejandro.avisando.com/

136: para visual studio cada proyecto es una carpeta... parece que no hay problema en ponerle puntos a las carpetas

144: abajo es el equipo remoto y arriba somos el propio ordenador
147: tras borrar antes, crear después un nuevo archivo y poner eso... 

yout-ube para que no se vean anuncios...
https://youtu.be/wiJqDm8bLds

https://obsproject.com/es
https://www.youtube.com/watch?v=wiJqDm8bLds

El VSCode también se puede instalar en Windows

https://code.visualstudio.com/download

----------------------------------------------------------



Memoria de vídeo a tope, y en red adaptador puente (188)

195: da igual el nombre que le pongamos
196: también da igual para tenerlo en casa
No usaremos cds de instalación adicionales ni proxys

Activar lo de SSH Server, que no viene marcado de serie
Escribir los cambios en los discos sí, el gestor de paquetes de España... y cogemos el primero en este caso, aunque podríamos haber cogido cualquier otro

Él sí marca la encuesta del uso de los paquetes
… le decimos que sí a instalar el cargador de arranque GRUB, es el sector de arranque

Se reinicia y escoger siempre la primera opción, nada de avanzado

235, pide la contraseña del root y pasa a 236, luego ya reiniciamos la máquina y se ve mejor

244 y darle a abrir con instalador de software

Ver - paleta de comandos - abrir el de FTP... 

https://youtu.be/fdXRJrZB3yI


*** Día 07/10/2025

Controlador IDE va de placa base a disco duro
La BIOS lleva pila, para por ejemplo la fecha
Ventilador, disipador y debajo el procesador

Entrada - Integración del ratón parece que te limita el ratón a dentro o fuera de la ventana de VirtualBox hasta que haces Ctrl+Dcha del ratón... no me gusta



Puerto 25: protocolo SMTP

Proceso de arranque: de BIOS a GRUB y ya al disco duro, hace de puente hacia el SO que usemos




<Primero va lo del fichero TXT>

Ctrl derecho+F para hacer Debian pantalla completa

Firefox: buscar guest additions VirtualBox debian 13 install
sudo apt install build-essential dkms linux-headers-$(uname -r)
Abrir terminal y poner su - (con espacio en medio, no se puede quitar): así pasamos al supervisor, me pide su contraseña
Pulsar en la rueda del ratón para pegar desde apt install… (el sudo no hace falta con el supervisor)
Ctrl+F

Dispositivos - Insertar imagen CD complementos de invitado
Ctrl+F - Archivos - VBox de abajo a la izquierda
Ejecutar programa y confirmar proceso (pide clave superusuario)
Reiniciar desde arriba

Snagit es como OBS, para grabar. Epoptes es software para visualizar otros equipos y hacerles control remoto

Instalar Chrome y VSCode en .Deb. Ponemos Chrome como predeterminado
En VSCode pinchar en el último de la izquierda y seleccionar:
- Spanish Language Pack for Visual (sale un Restart abajo a la derecha tras instalarlo)
- PHP Intelephense
- HTML CSS support
- SFTP de Natizyskunk

apt install php desde una terminal











*** Día 08/10/2025


su -
apt install epoptes-client
nano /etc/default/epoptes-client

clear borra la pantalla terminal

Abajo poner SERVER= ip de origen
^O, Intro… guardar en nano... ^X para salir

epoptes-client -c para que mediante un certificado se conecten origen y destino

reboot, que reinicia Debian

Ventana de usuario - Configuración (rueda) y elegir GNOME en Xorg, para que sean compatibles origen y destino en Epoptes
(Esto sólo era para configurar el Epoptes en mi equipo)

realvnc viewer VS Visor Tiger VNC que trae Debian por defecto
Ver los iconos grandes en Debian puede ser fallo de refresco, haz dos Ctrl+F consecutivos

En VirtualBox podemos tomar instantáneas. Las podemos Tomar y Restaurar

Me fui cuando lo de las carpetas importantes de Linux...……………………………………..






*** Día 09/10/2025

https://www.realvnc.com/en/connect/download/viewer/linux/
Descargar para Linux........... es para que sea más estable Epoptes

{
    "name": "arturo.avisando.com",
    "host": "arturo.avisando.com",
    "protocol": "sftp",
    "port": 22,
    "username": "arturo",
    "remotePath": "/home/arturo/public_html",
    "uploadOnSave": true,
    "useTempFile": false,
    "openSsh": false
}



<!doctype html>
<html lang="es" data-bs-theme="auto">
<head>
  <title>
    arturo.avisando.com &mdash;  Página predeterminada del dominio  </title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <meta name="theme-color" content="#2d6fff">
  <link rel="apple-touch-icon" sizes="180x180" href="data:image/png;base64,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">
  <link rel="icon" type="image/png" sizes="32x32" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAE4UExURUxpcWO2KWK0KGO2KVafIl+vJ2S4KmS4KV6sJ1+uJ16tJ2O3KWO2KWS4KWS5Kl2rJWGzKFuoJGK1KWGzKF6tJ1mlJF+vJ2O3KWO2KV2qJV6tJ2CwJ2S5KmCyKF2rJVyqJWO1KWK0KF+vJ12rJWS5KmO3KWS4KmS4KlmmJF6uJ2K1KVikJFypJV2sJWK1KVmlJFypJWO2KWS3KWS3KV6sJ2K1KWGzKFuoJWGzKGGzKFijI2CxKF6tJ2CxKGW5KmO2KWCxKGO2KV+vJ1mkJF+wJ1mmJGS5KmGyKGS5KmGyKF6tJ16tJ2W5KleiI2O3KWS4KVuoJFagI2CxKGGyKF2sJWS5Kl+uJ2K0KGS3KWO2KV2sJVumJF2rJWW5KlypJWGzKF+vJ2S4KVijI2GzKFuoJGGzKGW6KmW5KhLeswQAAABmdFJOUwDModUGV/bvOUlU39/u+S6RHsWWThRD494oQ1f9kB0d06lmRvfn8vcSUcgSHDXCETDb6u9AxroUmrMHhD6a/NCX1nAMdw36jfiSPTr7CODzIw+MgSL8o63l2igUQ/4eqpDxIZ4Qkq1IzdkAAAAJcEhZcwAAAHAAAABwAc54YpMAAADfSURBVDjLY2AYGSAJv3QgQ0J8DG7pgKAwhrjE2ORo7NK+wf6hHAwMqWlpkZzY5L0Y09LCgXQKkPbxdEaXdnX3SEvzCwExoyLS0tLsbVDlOR2BguzeUA4bkMNmzYKQNrewAwq5scL4TmkgIMQB47NygwVcEDpswQIqsvogjpxiOpjrgGSjlRlYKI1HQERZ2AjCtmRBdpOGVhoaMNVGdbWOAqo8syC6vyUlkOXF+TEDTlcVIc9rgi1opdhh8upc2CNHE6qCTwlX7HIYguTVpHHHvzyTsYyeGN4UJGowLPMNAAcjRWNz/z2rAAAAV3pUWHRSYXcgcHJvZmlsZSB0eXBlIGlwdGMAAHic4/IMCHFWKCjKT8vMSeVSAAMjCy5jCxMjE0uTFAMTIESANMNkAyOzVCDL2NTIxMzEHMQHy4BIoEouAOoXEXTyQjWVAAAAAElFTkSuQmCC">
  <link rel="icon" type="image/png" sizes="192x192" href="data:image/png;base64,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">
  <link rel="icon" type="image/png" sizes="16x16" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAACcUExURUxpcWK0KWGzKF2rJVOaIV6tJ1+vJ1OaIWW5KmK1KVypJWO2KWK1KVOaIWK0KGO2KVuoJGCwKFumJF6tJ1+vJ16tJ2KzKFijI2CxKGO2KWCxKFeiI2S5KlOaIWK0KV2sJWGyKF+vJ1mkJGCwJ2S4KlagI1+wJ2CwKGS4Kl6tJ2S4KWW5KmO1KV6tJ2GyKFijI1+uJ2CxKGGyKGW6Ko4fqckAAAAzdFJOUwC6rCIDVGsB/sgcys8Fv80WWhRDdqe7CoLPkQj3AsM1rVoMbvUKnY30NPL9yTOAB2V5rP4lLn8AAAAJcEhZcwAAADgAAAA4ARXTL58AAABrSURBVBjTY2AgHaiicnkZ1PT0EVwWEVEGTS0dXRhfXk5GmIHBQFvDkB3ElZZQ4VAGMdSNjTkV2RkEJY2NpSAajYyNjfm5gYSCLESruJgxGPApwQwT4gTxeQQQ1nExcRgzMqM4iJWNnYFcAAARPQlOwd2yOQAAAFd6VFh0UmF3IHByb2ZpbGUgdHlwZSBpcHRjAAB4nOPyDAhxVigoyk/LzEnlUgADIwsuYwsTIxNLkxQDEyBEgDTDZAMjs1Qgy9jUyMTMxBzEB8uASKBKLgDqFxF08kI1lQAAAABJRU5ErkJggg==">
  <link rel="mask-icon" color="#2d6fff" href="data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI5MzMuMzMzIiBoZWlnaHQ9IjkzMy4zMzMiIHZpZXdCb3g9IjAgMCA3MDAuMDAwMDAwIDcwMC4wMDAwMDAiPjxwYXRoIGQ9Ik0yLjYgMTY5LjdjLS4zIDEtLjEgMy42LjQgNS44LjUgMi4yLjkgNC4yIDEgNC41LjcgNi42IDEyIDI4LjQgMjUgNDcuOSA5LjQgMTQuMiA0NS4zIDYxLjkgNDkgNjUuMS4zLjMgNiA3IDEyLjcgMTUgNi42IDggMTMgMTUuNiAxNC4yIDE3IDEuMiAxLjQgMy4yIDMuNiA0LjMgNSA1LjYgNi42IDUzIDYwLjMgNTMuOSA2MSAuMy4zIDQuMyA0LjggOC44IDEwIDQuNiA1LjIgMTAuMiAxMS41IDEyLjUgMTQgMi4yIDIuNSA3LjUgOC4zIDExLjYgMTMgNC4xIDQuNiAxMC41IDExLjYgMTQuMSAxNS41IDMuNiAzLjggOSA5LjcgMTIgMTMgOSA5LjkgNDMuOSA0NC42IDUxLjggNTEuNSA0IDMuNiA3LjkgNyA4LjUgNy41IDIuNSAyLjQgMTUuNSAxMi40IDIxLjYgMTYuNyAxOC4yIDEyLjggMzUuMyAxOS45IDQ4LjggMjAgNC4yLjEgOC44LS4xIDEwLjItLjUgMjMuOS01LjcgNDYuOS0yMi40IDgyLjUtNTkuOSAxNy0xNy45IDI1LjItMjYuOSA0MC00My44IDYtNi45IDExLjItMTIuNyAxMS41LTEzIC4zLS4zIDUuMy01LjkgMTEtMTIuNSA1LjgtNi42IDExLTEyLjUgMTEuNS0xMy4xLjYtLjYgMy45LTQuNCA3LjUtOC41IDMuNi00IDcuNi04LjQgOC45LTkuOCAxLjMtMS41IDUuOC02LjQgMTAtMTEuMSA0LjItNC42IDkuOS0xMC45IDEyLjYtMTMuOSAyLjgtMy4xIDUuNS02LjEgNi02LjcgMS4zLTEuNCAxOS41LTIxLjMgMjEuNS0yMy40LjgtLjkgNC45LTUuNCA4LjktMTAgNC4xLTQuNyA4LTkgOC42LTkuNS41LS42IDMuMy0zLjcgNi02LjkgMi44LTMuMyA2LjEtNy4xIDcuNC04LjUgMS4zLTEuNCA0LjktNS44IDgtOS42IDMuMS0zLjkgNi4xLTcuNSA2LjctOCAxLjctMS42IDE3LjQtMjEuMyAyNS41LTMyIDI2LjEtMzQuNyA0MC41LTYwLjYgNDIuMi03Ni4yLjMtMy4zLjEtNC4zLTEuMi00LjYtNC43LTEuMS00MS43IDE2LjYtNzAuNSAzMy43LTcgNC4yLTEzIDcuNi0xMy4xIDcuNi0yLjQgMC0xMDguOSA2OS4zLTExOCA3Ni43LS41LjUtNC44IDMuNC05LjUgNi42LTQuNyAzLjItMTMuNyA5LjQtMjAgMTMuOC02LjMgNC40LTEyLjggOC45LTE0LjUgMTAtMS42IDEtMy43IDIuMy00LjUgMi45LTE5LjkgMTMuNS0yNi42IDE3LjktMzcuMSAyNC4zLTEyLjkgNy43LTI4LjcgMTUuOS0zNi45IDE5LTIxLjYgOC00MC4xIDUuNS03MS43LTkuOS0xMS41LTUuNi0zMy45LTE4LjctNDcuMy0yNy43LTEzLjItOC44LTczLjgtNTEuNC04Ny41LTYxLjQtMTguOC0xMy44LTY1LjEtNDUuMi05NS41LTY0LjgtMTEtNy4xLTMyLjgtMTkuMy00Ni42LTI2LjEtMTQuNS03LjEtMjEuOC05LTIyLjgtNS43eiIvPjwvc3ZnPg==">
  <script>if (window.matchMedia('(prefers-color-scheme: dark)').matches){ document.documentElement.setAttribute('data-bs-theme', 'dark')} else{ document.documentElement.setAttribute('data-bs-theme', 'light')}</script>
  <link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Roboto+Mono:wght@400&family=Roboto:wght@400;500&display=swap" rel="stylesheet">
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-4bw+/aepP/YC94hEpVNVgiZdgIC5+VKNBQNGCHeKRQN+PtmoHDEXuppvnDJzQIu9" crossorigin="anonymous">
  <style>
    /*!
     * Virtualmin Welcome Page v8.0
     * Copyright 2025 Virtualmin
     * Licensed under MIT
     */
    :root, [data-bs-theme=light]{ --bs-font-sans-serif: "Roboto", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; --bs-font-monospace: "Roboto Mono", SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; --logo-filter: brightness(1.05) contrast(1.2); --vm-veil-opacity: 0.66; --vm-bg-filter: opacity(66wg8bqVKbisS5AxhpjdjRTBCqjRCac) blur(0) contrast(1.5) brightness(0.9); --vm-bg2-color: #ffffff; --bs-border-color-light: #6b727977; --bs-card-bg-semi-transparent: #ffffff44; --vm-domain-link: #0744c7; --header-text-body-secondary-opacity: 0.91; --footer-text-body-secondary-opacity: 0.81;} [data-bs-theme=dark]{ --bs-body-bg: var(--bs-dark-bg-subtle); --logo-filter: saturate(1.666) contrast(.51) brightness(1.33); --vm-veil-opacity: 0.41; --vm-bg-filter: opacity(33%) blur(0) contrast(0.9) brightness(1.2); --vm-bg2-color: #000000; --bs-border-color-light: #6b7279; --bs-card-bg-semi-transparent: #00000077; --vm-domain-link: #2d6fff; --header-text-body-secondary-opacity: 1; --footer-text-body-secondary-opacity: 0.86;} .domain{ --bs-text-opacity: 1; color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)); filter: saturate(1.5); text-align: center;} .card{ background: var(--bs-card-bg-semi-transparent) !important; min-height: calc(100% - 24px);} .card-body{ flex-direction: column; display: flex;} .card-body>.btn{ margin-top: auto;} a.link-secondary:active, a.link-secondary:hover{ color: var(--bs-link-color) !important;} .border-top-light{ border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color-light) !important;} .border-bottom-light{ border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color-light) !important;} .text-align-justify{ text-align: justify;} .text-tt-small tt{ font-size: .933em; white-space: pre-line; word-break: break-all;} header .text-body-secondary{ opacity: var(--header-text-body-secondary-opacity);} footer .text-body-secondary{ opacity: var(--footer-text-body-secondary-opacity);} li.mb-1:has(a[href*="/contact/"]):not(:hover) .alert-warning-container{ visibility: hidden;} .alert-warning-hover:hover{ cursor: help;} .alert-warning-hover{ cursor: help; filter: saturate(1.5) hue-rotate(-15deg) contrast(0.9) brightness(1.1) opacity(0.8); width: 201px; padding: 6px 9px; margin-top: 4px; word-break: break-all;} .alert-primary svg{ fill: var(--bs-primary-text-emphasis)} .filter-grayscale-hover{ filter: var(--logo-filter);} .container:not(.no-max){ max-width: 1290px; width: 81%;} @media (min-width: 1400px){ .container.no-max{ max-width: 1290px; width: 81%;}} .container .text-body-secondary{ color: var(--bs-color) !important;} @media (min-width: 992px){ body .container{ transform: scale(0.81); transform-origin: top center;}} @media (max-width: 1199.98px){ footer:not(:hover) .alert-warning-container{ visibility: initial;}} @media (max-width: 991.98px){ .container{ width: 96%;}} .veil{ backface-visibility: hidden; bottom: 0; left: 0; overflow: hidden; position: fixed; right: 0; top: 0; user-select: none; z-index: -2;} .veil .veil-vm{ bottom: 0; left: 0; position: absolute; right: 0; top: 0} .veil .veil-vm+.veil-vm{ opacity: var(--vm-veil-opacity); z-index: 0;} .bg{ background: transparent no-repeat fixed center; background-size: cover; filter: var(--vm-bg-filter); transform: scale(1.02)} .bg-0{ background-image: url("data:image/jpg;base64,/9j/4AAQSkZJRgABAQEBLAEsAAD/4gIwSUNDX1BST0ZJTEUAAQEAAAIgbGNtcwRAAABtbnRyR1JBWVhZWiAH5wAIABcACgAYAARhY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWxjbXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZkZXNjAAAAzAAAAG5jcHJ0AAABPAAAADZ3dHB0AAABdAAAABRrVFJDAAABiAAAACBkbW5kAAABqAAAACRkbWRkAAABzAAAAFJtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAFIAAAAcAEcASQBNAFAAIABiAHUAaQBsAHQALQBpAG4AIABEADYANQAgAEcAcgBhAHkAcwBjAGEAbABlACAAdwBpAHQAaAAgAHMAUgBHAEIAIABUAFIAQwAAbWx1YwAAAAAAAAABAAAADGVuVVMAAAAaAAAAHABQAHUAYgBsAGkAYwAgAEQAbwBtAGEAaQBuAABYWVogAAAAAAAA81EAAQAAAAEWzHBhcmEAAAAAAAMAAAACZmYAAPKnAAANWQAAE9AAAApbbWx1YwAAAAAAAAABAAAADGVuVVMAAAAIAAAAHABHAEkATQBQbWx1YwAAAAAAAAABAAAADGVuVVMAAAA2AAAAHABEADYANQAgAEcAcgBhAHkAcwBjAGEAbABlACAAdwBpAHQAaAAgAHMAUgBHAEIAIABUAFIAQwAA/9sAQwAhFxkdGRUhHRsdJSMhKDJTNjIuLjJmSU08U3lqf313anRyhZa/ooWNtZBydKbjqLXGzNbY1oGg6/zp0Pq/0tbO/8IACwgDcAZAAQERAP/EABcAAQEBAQAAAAAAAAAAAAAAAAABAgP/2gAIAQEAAAAB6AIEAgiAQAFAAABSgiQFAoIQFAFAooAKBQoAoAAoAUA5gECAgiAQAKAAABSgiIKCgEQUAFChQAUChQFAACgAoA5gCCAQiAQAoAAABVAREUKAEAAClAoBQBQoFAACgAoAOYAgQEEgCAUAoIWAKUqEQBQKggABSgUCgBQUFAAFAAoADmAECAhELCAoCgAABVEIgKBQhAAoUChQAUCgoACgAKAAXkAEBARAIQUCgAAApQiEFBQEQBQKKBQAUBQUAFAAoAAU5AAgIEQBAAUAAAClBEQoUAIAAUoCgKACgoAoAFAACg5kAIBBCAQAUAAABSgIgCgURAAoUBQoACgUFAAFAACgOYQBAQIhUIAoAolAAKUiEBQUWJAFAoFCgAKAoKAAUAAKAOYIAgIIAhAoCgAABShEIUFCkgAFBQKABQBQUACgACgAOYEAIEIAgACgAAApQIgBQUJACgUBQUAAUFAAoABQAA5gEAQIQBAAoAAoAFKhEAoFVEJQFACigABQKAKAAKAAA5gCAQEQBABQFAAAKUQiCgoUiAFAUBQACgKAoAAUAABTkAEAgQBBAUFAAABSgiACgUQABQAoACgFAoAAoAACg5AAQCCAQAAoAAoAKBEAoCggBQAKAoABQKAAUAABQDmQAEBCAIACgAKAAUpCIKBQBCgAKAoAAUCgAKAAAUAOYgAICCLBABQUAAAKUIQAUCkAAUAFAAKAoACgAAUAA5hAAQEAQAAUAAUAFBCAUBQgBQAFAAUAoAUAAAoAAOYBACAgCAAKABQACgIQoCgBKAAFAoAAoAoAABQAAU5ACACBAEAFAFAAAoLBABQFIAAKAKAAKAUAABQAAKDkACACAIAABQAFAAoQQFAKCAKABQABQCgAAKAAAoDmQAIAQBAACgAoAAUCAAChUAAAUAoAAoAAFAAAoAOYQAIAgCAFACgAACgCACgFIAAoAUAAUAAFAAAoAA5gIAIACAAAoAAUAFECCgAoCCgAUAAKAAoAAAoAAU5ABABABAAFAAoAAKBAACgAAAUABQAAoAAAoAAUDnAAQAgASgABQAAAoAQBQAKQBQACgAAUAAAUAAKAOZAAQAgAAAUAAKAAogRQAFAAABQAACgAAKAAKAAOYQABAAgAKAAUAACgIACgAAAUAAAUAAUAAAUAADmAIAEAAAABQAAAoAIFAAAUAAAAUAAoAAAoAAAOYAEAEAAABQACgAAqAAAFAAAACgABQAABQAAAKOQAAQACAFAAFAAAFAgAKAAAAFAAAUAACgAAACgOZAAAQAAAAKAAACgAQKAAAFAAAAKAAUAAAAoAA5gCAAIAAAoAAKAAAAAAAoAAAAKAAKAAAAUAAA5gAIAAEFAAAUAAAFCAAKAAAABQAAUAAAAoAAAU5AAAIAAAACgAAAKAICgAAAoAAAAoAAAKAAAKAOQAAAQAAAUAAAKAAAAAAoAAAAAoAAAoAAAoAA5iAAAAECgAAAoAACiAAFAAAAAUAAAUAAAAUAADmABAAAAAABQAAAKAQKAAAAoAAAAUAAAAKAAADmAAAgAAABQAABQAAAAACgAAAAAUAAAAoAAAA5gAAACABQAABQAAAAAAoAAAAAAoAAACgAAAAMIAAAAAAAACgAAAoIAFAAAAAAAoAAABQAAAADAAEAAAAAAKAAAAUBAKAAAAAAAKAAAAUAAAAAwAAAgAAAAUAAAAKAEUAAAAAAACgAAABQAAAAMAAACAAAAoAAAAKAAAAAAAAAABQAAAAAUAAAwAAAAQAAFAAAAAUACKAAAAAAAABQAAAAAAAUMAAAAEAAAFAAAABQCACgAAAAAAAAUAAAAAAAMgAAAIAAAAUAAAAKIAAAACkFQABQAAAFAAAAADIAACAAAAAACgAAAAAAAAAAAAAFAAAAAAABQyAACAAAAAACgAAAKQAAAAVKQAACgAAAAAAACgMgAQAAAAAAACpQAAAAAAAALAAAFAAAAAAAAAUyAIAAAQAoAAAAFAAAAAAAAAAAKAAAAAAUAQAIQqAAAEAAAoAAAAUAAAAAAAAAAFAAIFgCgFigADKAAAAQAAAFAAAAFAAAAAAAAAAoABFEogAAoAKDMAAgAAAAABQAAAAoABKAAAAAAAKAAACAAABSgwAAgAAAAAAUAAAAKACCxQAAAAABQAAAARSFIBUFMgAEAAAAAAAUAAAAVKIAUlAJQAAABQJQAAAACwsoDAAEAAEAUikoABQFgABQgsAAWVFgCgAACoVFEoAAKQBQAwAEAEAAAABQBUoBBZQFAQAAAVKASglEtgsALKAAALKCWUlMAAQBAIAqBQAUCgEIooqAoQAAAAUAAAlWFgCkUAAKShFDAAIAIBAAAAFBSgggopYCiBKAACwFlSgAsLAAsFgqWLKAKEqWXAAlgAgAQAAAKUoCAQqgCgEsABYALKRQAWBZUoSoWWKAAAoDABAAEAEUlgCWKKFBUABQAChUQAASgKSkUAAFligAAAAAMgCCkQJQgoQoELBQUAhQAKAKtzZAAABYCkoAAVBQSgAACVLFMgABBCVAWFgUELAoCxRAUAUCqQgAABYLCooAAALFCUhQIULBKygKAlgQiiFRUpYQUhZVgsogFAKFWSwAAACwFRUqUACyxYCwqVKASgWFwgFBAICwIBQJZUpCpbZCkAUCgogAAAEtQqWKRQ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");} .bg-1{ background-color: var(--vm-bg2-color) !important;}
</style>
</head>
<body>
  <div class="veil">
    <div class="veil-vm bg bg-0"></div>
    <div class="veil-vm bg-1"></div>
  </div>
  <div class="container py-4">
    <header>
      <div class="d-flex flex-column flex-lg-row align-items-center pb-3 mb-4 border-bottom-light">
        <a href="https://www.virtualmin.com/docs/server-components/website-default-page/" target="_blank"
          class="d-flex align-items-center text-body-secondary text-decoration-none">
          <span class="fs-3">
            Página predeterminada del dominio          </span>
        </a>
        <nav class="d-inline-flex mt-2 mt-lg-0 ms-lg-auto">
          <span class="me-3 py-2 text-decoration-none domain font-monospace fs-5">
            arturo.avisando.com          </span>
        </nav>
      </div>
      <div data-type="domain" class="p-3 pb-lg-4 mx-auto text-center">
        <h1 data-domain="status" class="display-5 fw-normal text-success mb-4">
          Sitio web habilitado        </h1>
        <p class="fs-5 text-body-secondary text-align-justify">
          Esta página indica que un sitio web recién creado está funcionando. Esta página predeterminada se genera automáticamente después de que Virtualmin configura un servidor virtual, un panel de control de alojamiento de código abierto de primer nivel, que ofrece automatización y gestión integral para entornos de alojamiento web.        </p>
      </div>
      
    </header>
    <main data-type="domain">
      <div class="row row-cols-1 row-cols-lg-2 mb-3 justify-content-center text-center">
        <div data-login="row" class="col col-lg-8 col-xl-7">
          <div data-login="container" class="card mb-4 rounded-3 shadow-sm border-success">
            <div data-login="head" class="card-header py-3 border-success">
              <h4 class="my-0 fw-normal">
                Acceso              </h4>
            </div>
            <div class="card-body">
              <h1 class="card-title">
                <small data-login="icon" class="display-5 fw-light text-success">
                  ⎆
                </small>
              </h1>
              <div class="mt-3 mb-4 px-1 fs-5 text-align-justify text-tt-small">
                <span>
                  Si usted es el propietario del sitio web, esta página predeterminada aparece porque todavía no se ha configurado ningún sitio web en este servidor virtual. Para modificar esta página y cargar su sitio web, inicie sesión en Virtualmin y coloque sus archivos en el directorio <tt>public_html</tt>.                </span>
              </div>
              <a data-login="button" href="https://46.183.115.201:10000" class="w-100 btn btn-lg btn-success">
                Iniciar sesión en Virtualmin              </a>
            </div>
          </div>
        </div>
    </main>
    
    <footer class="pt-4 my-lg-5 pt-lg-5 border-top-light">
      <div class="row">
        <div class="col-12 col-xl">
          <svg class="filter-grayscale-hover" width="33" height="33" version="1.0" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg"><g transform="matrix(.44671 0 0 .45324 -68.413 -32.413)"><g transform="matrix(.88818 0 0 .88818 21.832 12.96)"><path d="m161.65 120.11c-4.63-0.0192-13.808-11.999-13.802-13.549 4e-3 -0.96326 9.2096 5.9904 13.835 6.0096 4.641 0.0193 13.968-6.8588 13.963-5.8943-7e-3 1.5486-9.3603 13.453-13.996 13.434z" fill="#4bac00"/><g fill="#0044d6"><path d="m216.21 92.72c4.6299 0.01919 13.808 11.999 13.802 13.549-4e-3 0.96326-9.2096-5.9904-13.835-6.0096-4.6409-0.0193-13.968 6.8588-13.963 5.8943 7e-3 -1.5486 9.3603-13.453 13.996-13.434z"/><path d="m209.88 84.216c4.3573-1.5655 17.08 6.5526 17.603 8.0113 0.32553 0.90657-10.703-2.4793-15.056-0.91543-4.3676 1.5692-10.779 11.222-11.105 10.315-0.52329-1.4576 4.1947-15.843 8.5577-17.41z"/><path d="m167.98 128.62c-4.3573 1.5655-17.08-6.5526-17.603-8.0113-0.32551-0.90658 10.703 2.4793 15.056 0.91543 4.3676-1.5692 10.779-11.222 11.105-10.315 0.5233 1.4575-4.1946 15.843-8.5577 17.41z"/><path d="m201.02 78.389c3.5591-2.9614 18.291 0.31587 19.282 1.5075 0.61599 0.74059-10.905 1.3309-14.461 4.2891-3.5675 2.9684-6.2911 14.232-6.9078 13.491-0.99024-1.1907-1.4769-16.322 2.0869-19.287z"/><path d="m176.83 134.44c-3.5591 2.9614-18.291-0.3159-19.282-1.5074-0.61596-0.74068 10.905-1.3309 14.461-4.2892 3.5675-2.9684 6.2911-14.232 6.9078-13.491 0.99022 1.1907 1.4769 16.322-2.0869 19.287z"/><path d="m190.71 75.943c2.3316-4.0001 17.296-5.959 18.634-5.1782 0.83212 0.48528-9.7926 4.9805-12.122 8.9764-2.3371 4.0095-1.0439 15.526-1.8771 15.04-1.3378-0.78018-6.9703-14.833-4.6356-18.838z"/><path d="m187.15 136.89c-2.3316 4.0001-17.296 5.959-18.634 5.1782-0.8321-0.48519 9.7926-4.9804 12.122-8.9764 2.3371-4.0095 1.044-15.526 1.8771-15.04 1.3378 0.78018 6.9703 14.833 4.6356 18.838z"/><path d="m180.18 77.172c0.82289-4.5563 14.215-11.515 15.74-11.239 0.94789 0.1714-7.4986 8.0294-8.3206 12.581-0.82483 4.5671 4.3291 14.946 3.38 14.775-1.5239-0.2756-11.623-11.554-10.799-16.116z"/><path d="m197.68 135.66c-0.82289 4.5563-14.215 11.515-15.74 11.239-0.94791-0.17137 7.4986-8.0294 8.3206-12.581 0.82485-4.5671-4.3291-14.946-3.38-14.775 1.5239 0.27559 11.623 11.554 10.799 16.116z"/><path d="m170.7 81.929c-0.7851-4.5629 9.4189-15.682 10.946-15.945 0.94934-0.16314-4.3002 10.11-3.5159 14.668 0.78693 4.5737 9.18 12.564 8.2294 12.728-1.5263 0.26223-14.874-6.882-15.66-11.451z"/><path d="m207.15 130.9c0.78509 4.5629-9.4189 15.682-10.946 15.945-0.94935 0.16325 4.3002-10.11 3.5159-14.668-0.78693-4.5738-9.18-12.564-8.2294-12.728 1.5263-0.26225 14.874 6.8821 15.66 11.451z"/><path d="m163.43 89.639c-2.2984-4.0193 3.4872-17.958 4.8328-18.727 0.8363-0.478-0.58308 10.971 1.7129 14.986 2.3038 4.0288 12.924 8.6669 12.086 9.1455-1.3445 0.76846-16.331-1.3798-18.632-5.4044z"/><path d="m214.43 123.19c2.2983 4.0192-3.4872 17.958-4.8328 18.727-0.83631 0.47805 0.58308-10.971-1.7129-14.986-2.3038-4.0288-12.924-8.6669-12.086-9.1456 1.3445-0.76842 16.331 1.3799 18.632 5.4045z"/><path d="m159.23 99.372c-3.5344-2.9908-2.8651-18.068-1.8636-19.251 0.62237-0.73522 3.2043 10.509 6.735 13.496 3.5428 2.9979 15.109 3.7241 14.485 4.4602-1.0006 1.1819-15.818 4.2888-19.357 1.294z"/><path d="m218.63 113.46c3.5344 2.9908 2.8651 18.068 1.8637 19.251-0.62235 0.73524-3.2044-10.509-6.7351-13.496-3.5428-2.9979-15.109-3.7241-14.485-4.4603 1.0006-1.1819 15.818-4.2888 19.357-1.294z"/><path d="m158.61 109.96c-4.3442-1.6016-8.8718-15.998-8.3354-17.452 0.33341-0.90372 6.6053 8.779 10.945 10.379 4.3544 1.6054 15.471-1.6679 15.137-0.76305-0.53602 1.4529-13.397 9.4401-17.747 7.8364z"/><path d="m219.25 102.88c4.3442 1.6016 8.8718 15.998 8.3353 17.452-0.33337 0.90375-6.6053-8.779-10.945-10.379-4.3545-1.6054-15.471 1.6679-15.137 0.76303 0.53603-1.4529 13.397-9.4401 17.747-7.8364z"/></g></g></g></svg>
          <svg class="filter-grayscale-hover" width="200" height="20.75" version="1.0" viewBox="0 0 447.58 46.449" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><metadata><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><g transform="matrix(1.1589 0 0 1.1589 -235.86 -102.17)"><path d="m238.12 127.61h5.2816l22.447-36.307h-5.8684l-19.146 31.787-19.072-31.787h-5.9418l22.3 36.307m33.123 0h5.4283v-26.874h-5.4283v26.874m0-30.116h5.4283c0-2.0634 0.90472-5.1586 0-6.1903-0.90474-1.0317-4.5236-1.0317-5.4283 0-0.90472 1.0317 0 4.1269 0 6.1903m14.68 30.116h5.4283v-15.672c0-5.0113 5.7461-7.1961 13.302-7.6874l0.54746-3.4379c-5.795 0.19652-11.722 0.80811-13.849 3.7559l-0.0855-3.4902-5.5134 2.5691 0.17055 23.963m26.934 0h5.4283v-23.582h9.0227v-3.2917h-9.0227v-10.169l-5.5046 2.376 0.0763 7.7932-7.737 0.0645-0.46729 3.4496 8.2043-0.22248v23.582m55.273-26.874h-5.4283v13.805c0 3.2917-0.73355 5.3551-2.4207 7.0255-2.274 2.1126-5.8684 3.3408-10.05 3.3408-4.4747 0-8.2892-1.2282-10.123-3.39-1.247-1.3756-1.9072-3.5373-1.9072-6.2886v-14.493h-5.4283v14.493c0 3.9795 1.027 6.7799 3.1543 8.7451 3.0076 2.8004 7.849 4.2743 13.864 4.2743 6.2352 0 10.196-1.4739 12.91-4.8147v4.176h5.4283v-26.874m50.165 0h-5.4283v4.7656c-3.9612-3.7338-8.876-5.4043-15.845-5.4043-12.03 0-21.126 6.0921-21.126 14.149 0 8.0081 9.1694 14.002 21.493 14.002 6.822 0 11.223-1.523 15.478-5.3552v4.7164h5.4283v-26.874m-21.126 2.7021c8.8026 0 15.698 4.6182 15.698 10.612 0 6.0921-6.7487 10.858-15.405 10.858-9.096 0-16.065-4.7656-16.065-10.907 0-5.8465 7.0421-10.563 15.771-10.563m30.397 24.172h5.4283v-36.307h-5.4283v36.307m14.68 0h5.4283v-15.672c0-5.3552 4.0345-8.4995 10.783-8.4995 3.301 0 6.3819 0.88436 8.3625 2.4565 1.7605 1.3756 2.4941 3.2426 2.4941 6.043v15.672h5.4283v-15.574c0-2.6039 0.58683-4.2743 1.9072-5.5516 1.9072-1.9652 5.2816-3.0952 9.096-3.0952 3.5211 0 6.602 0.93346 8.4358 2.5547 1.4671 1.3757 2.2006 3.3899 2.2006 6.0921v15.574h5.4283v-15.967c0-3.5374-0.95363-5.8464-3.2276-7.7625-2.7875-2.4565-7.3355-3.8321-12.544-3.8321-6.2352 0-10.563 1.6213-13.937 5.2077-3.1543-3.5865-7.1155-5.1586-13.131-5.1586-5.0615 0-8.2158 1.0318-11.297 3.7339v-3.0951h-5.4283v26.874m68.869 0h5.4283v-26.874h-5.4283v26.874m0-30.116h5.4283c0-2.0634 0.90471-5.1586 0-6.1903-0.90474-1.0317-4.5236-1.0317-5.4283 0-0.90469 1.0317 0 4.1269 0 6.1903m14.68 30.116h5.4283v-14.788c0-2.9969 0.58684-4.5691 2.1273-6.0921 2.1273-2.0635 5.8684-3.2917 10.123-3.2917 3.9612 0 7.5556 1.0808 9.7562 2.8987 1.9072 1.6704 2.6408 3.6356 2.6408 7.1729v14.1h5.4283v-14.1c0-4.5199-0.9536-6.9273-3.521-9.2364-3.1543-2.653-7.9957-4.176-13.644-4.176-5.2816 0-9.5362 1.3756-12.91 4.1269v-3.4882h-5.4283v26.874" fill="#0044d6"/></g></svg>
          <small class="d-block mt-3 mb-3 text-body-secondary">&copy; 2005–2025          </small>
        </div>
        <div class="col-6 col-md">
          <h5>
            Recursos          </h5>
          <ul class="list-unstyled text-small">
            <li class="mb-1">
              <a target="_blank" class="link-secondary text-body-secondary text-decoration-none" href="https://www.virtualmin.com/docs/">
              Documentación              </a>
            </li>
            <li class="mb-1">
              <a target="_blank" class="link-secondary text-body-secondary text-decoration-none" href="https://www.virtualmin.com/download/">
              Descargar              </a>
            </li>
            <li class="mb-1">
              <a target="_blank" class="link-secondary text-body-secondary text-decoration-none" href="https://forum.virtualmin.com/">
              Foro              </a>
            </li>
            <li class="mb-1">
              <a target="_blank" class="link-secondary text-body-secondary text-decoration-none" href="https://www.virtualmin.com/support/">
              Apoyo              </a>
            </li>
            <li class="mb-1">
              <a target="_blank" class="link-secondary text-body-secondary text-decoration-none" href="https://www.virtualmin.com/shop/">
              Comercio              </a>
            </li>
          </ul>
        </div>
        <div class="col-6 col-md">
          <h5>
            Acerca de          </h5>
          <ul class="list-unstyled text-small">
            <li class="mb-1">
              <a target="_blank" class="link-secondary text-body-secondary text-decoration-none" href="https://www.virtualmin.com/about/">
              Compañía              </a>
            </li>
            <li class="mb-1">
              <a target="_blank" class="link-secondary text-body-secondary text-decoration-none" href="https://www.virtualmin.com/contact/">
              Contacto              <div class="row">
                <div class="col-12 col-md col-xl-9 alert-warning-container text-align-justify">
                  <div class="alert alert-warning alert-warning-hover small">
                    <svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" fill="currentColor" class="flex-shrink-0 me-1 mb-1" viewBox="0 0 16 16"><path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zM8 4a.905.905 0 0 0-.9.995l.35 3.507a.552.552 0 0 0 1.1 0l.35-3.507A.905.905 0 0 0 8 4zm.002 6a1 1 0 1 0 0 2 1 1 0 0 0 0-2z"></path></svg>
                    Virtualmin no es responsable de entregar esta página. Las preguntas sobre su cuenta o un sitio deshabilitado deben dirigirse a su proveedor de alojamiento.                  </div>
                </div>
              </div>
              </a>
            </li>
          </ul>
        </div>
      </div>
    </footer>
  </div>
</body>
</html>




https://code.visualstudio.com/shortcuts/keyboard-shortcuts-linux.pdf --- Teclas rápidas





En clouding.io añadimos desde DNS, con IP 46.183.115.201
Crear servidor virtual. Esto hará modificaciones en la carpeta etc

Paleta de comandos - SFPT:config, para interconectar los equipos
Ctrl+Mays = multicursor, para escribir lo mismo en varias líneas

En username irá nuestro nombre
pwd en la terminal es para ver en qué carpeta estamos, muestra el path
remotePath es /home/Alfonso/public_html
uploadonsave: ponemos true, lo que se guarda sube el al servidor

Los directorios ocultos llevan un punto delante en el nombre

Si en la web detrás del .com no ponemos un /<nombre programa> nos llevará por defecto al index.html
Al eliminar en VSCode hay que borrar del servidor y del local
Sync no elimina archivos, sólo actualiza los archivos a la última versión y añade los que no existen

Contraseña de nuestro servidor virtual: nombre@123456 (Es decir, arturo@123456)


HTML:
<title> se refiere a la solapa de la web, va dentro de <head>

En <body> tenemos de <h1> a <h6>, de mayor a menor tamaño

Ctrl+F5 = F5 + la información de caché. Usarlo en lugar de F5 al crear webs, para que nos actualice todo lo que la web lleva consigo, F5 no actualiza lo almacenado en caché

En una web F12 saca el código, allí podemos ir viendo a qué parte del código corresponde cada cosa que vayamos marcando

Ctrl+Mays+I en VSCode: para dar formato al archivo, para verlo tabulado
<strong> es negrita

<ul> es el inicio de una lista (desordenada) de <li>'s
<ol> es una lista ordenada, también de <li>'s











*** Día 10/10/2025



https://aulavirtual.campusspainx.es/login/?lang=es


https://aulavirtual.campusspainx.es/mod/zoom/loadmeeting.php?id=63274

VS trata las carpetas como proyectos

https lleva una conexión cifrada, que sólo puede desencriptar el equipo que lo ha encriptado

Jamás instalar un certificado digital en un equipo que no sea nuestro, ¿y si se te olvida quitarlo después?

42, es que estaba en Ubuntu y no en el equipo de clase, y se confundía

La carpeta etc es donde están todas las configuraciones

49 no es seguro porque no manejo ese dominio, no tengo el certificado de seguridad
Esto sólo se consigue a nivel de red local, editando el fichero hosts de etc

59 lo hace para anular lo falso que nos había preparado para el curso

69 creo que era sacado desde los archivos, al ejecutar

ol type="" start=""

dt es la palabra y dd la definición, también está dl (lista de definición)

Podemos anidar listas dentro de otras

img es para subir imágenes, no tiene etiqueta de cierre
img src="" alt="", ruta y texto alternativo (no sale ni como etiqueta ni como pie de foto)
alt también está orientado a personas con discapacidad visual, ya sea por voz o por braille

83, entrando de incógnito sale bien, no le tarda

https://www.youtube.com/watch?v=mhXEgMpCrKE

Hay que indicar la dirección exacta donde está el index, al poner la dirección "inicial" no te lleva al index si ese archivo está en una subcarpeta


<h1> CURRICULUM VITAE </h1>
<img src="no photo.jpg" alt="no soy yo">
<ol>
<li> Formación </li>
<ul>
    <li> Tiempos de instituto</li>
    <li> Administración y Dirección de Empresas</li>
    <li> Este curso</li>
</ul>
<li> Experiencia</li>
<ul>
<li> Unas prácticas</li>
<li> Nada serio</li>
<li> Unos años hasta ahora</li>
</ul>
<p> Una línea suelta</p>

</ol>
<p> Y si puedes <strong>me contratas</strong></p>




<h1> CURRICULUM VITAE </h1>
<img src="no photo.jpg" alt="no soy yo">
<ol>
<li> Formación </li>
<ul>
    <li> Tiempos de instituto</li>
    <li> Administración y Dirección de Empresas</li>
    <li> Este curso</li>
</ul>
<li> Experiencia</li>
<ul>
<li> Unas prácticas</li>
<li> Nada serio</li>
<li> Unos años hasta ahora</li>
</ul>
<p> Una línea suelta</p>

</ol>
<p> Y si puedes <strong>me contratas</strong></p>


Las etiquetas siempre tienen que ir en minúsculas

html5 para evitar los símbolos raros en acentos, ñ's...


No te dejan tener bizum por ser autónomo y tener cuenta empresa??

Para abrir una nueva carpeta dependiente de otra situarse sobre ella antes o tenerla abierta

217 creado a partir de la etiqueta HTML5

&nbsp es para añadir espacios más allá del primero, <br> para añadir saltos de línea

Botón secundario del ratón - Dar formato al documento, para que quede bien alineado.... viene de la extensión HTML CSS
Tecla rápida: Ctrl+Mays+I
li*6> saca 6 etiquetas, según Emet

Ctrl+D para el multicursor

232 es tras un li*10> lorem

En 235 tengo una etiqueta de tamaño de la img, por píxeles, style="width: 100px;"

Si llevamos la imagen a otra carpeta en src podemos poner la dirección web (web, no Linux) completa de la imagen (forma absoluta) o usando el recorrido hacia la imagen desde el index.html (forma relativa, 240)
src="imágenes/taliban.jpg" cuando está la imagen por debajo
src="../../taliban.jpg" cuando para llegar a la imagen hay que subir hacia arriba

Es más aconsejable configurarlo de forma relativa, viene mejor para no tener que alterar el código en caso de modificaciones

247: creación de descargable comprimido, que también puede ser un doc, pdf…

table border=1


*** Día 13/10/2025

131025

Para comenzar a usar 'Cursos AULA VIRTUAL', entre en
https://aulavirtual.campusspainx.es/login/?lang=es


https://lenguajehtml.com/html/: web con documentación de HTML


Fichero de partida:
<h1> CURRICULUM VITAE </h1>
<img src="no photo.jpg" alt="no soy yo">
<ol>
<li> Formación </li>
<ul>
    <li> Tiempos de instituto</li>
    <li> Administración y Dirección de Empresas</li>
    <li> Este curso</li>
</ul>
<li> Experiencia</li>
<ul>
<li> Unas prácticas</li>
<li> Nada serio</li>
<li> Unos años hasta ahora</li>
</ul>
<p> Una línea suelta</p>

</ol>
<p> Y si puedes <strong>me contratas</strong></p>



Para hacer aplicaciones se usan básicamente formularios y tablas, más que etiquetas

((Pasamos de una red social a una red de contenidos))

stackoverflow.com: web con temas informáticos



https://code.visualstudio.com/shortcuts/keyboard-shortcuts-linux.pdf

<br> hace un salto de línea, no tiene cierre. <img> tampoco tiene etiqueta de cierre
Las etiquetas también tienen atributos y propiedades. Por ejemplo todas tienen atributo id

También tenemos propiedades

Los eventos son todos los que empiezan por on, es cuando se produce una acción sobre el elemento

En los <li> podemos meter hasta formularios y tablas

Los id's se suelen utilizar para CSS y para JavaScript

65, 66: ejemplos de atributos
69: atributos que pueden ir

Hay que cargar los CSS y JavaScript en el head, pero si se ponen al final Google lee la página antes (de cara a indexarlo en el buscador)

Las etiquetas de agrupación agrupan otras etiquetas. De ellas <div> es la principal. Al <div> podemos meterle un <id>

En el body van header, main… que antes eran div

Aside será un submenú lateral, publicidad
82: nav será el menú superior

Un div crea una caja con un espacio por arriba y por abajo

span es un div que no genera una caja, va pegado a lo anterior, div ocupa todo el ancho y span no

85 viene de div>div>div>div>lorem

title es la etiqueta, por ejemplo de imágenes

93: pre es la etiqueta para que el texto se muestre tal y como lo has escrito

anclas, alrededor de 112. Son las # para viajar a diferentes zonas de la página



ESTRUCTURA MATRIZ QUE CREO:

<head>


<title> Curso de programación </title>







</head>


<body>
<header>
<h1> Curso de programación de aplicaciones </h1>

<nav>
<ul>
<li> <a href="">  </a></li>
<li> <a href="">  </a></li>
<li> <a href="">  </a></li>
<li> <a href="">  </a></li>
</ul>

</nav>


</header>
<main>
<section id=""> 
<h2><a href=""></a></h2>    
<ul>
    
    <li></li>

</ul>


</section>


</main>


</body>


-------------------------------------- rayo

colspan y rowspan no van en tr´s, van en td´s

137: si pones 2 se va a comer 2

146: centrar la tabla sería con CSS

Trabajar en UTF-8... crear la etiqueta html:5 para poder formarlo después

botón derecho sobre la solapa de VSCode y "Copiar ruta de acceso relativa": para pegar en la barra de direcciones de Chrome esa ruta, por ejemplo

El diseño lo veremos con CSS

195: podemos copiar-pegar con botón derecho sobre el fichero
196: con Ctrl sobre por ejemplo index.html (a la derecha) te propone las webs disponibles


Etiqueta <nav> en HTML
1
2
La etiqueta <nav> en HTML se utiliza para definir una sección de navegación que contiene enlaces a otras partes del sitio web o a páginas externas. Es una etiqueta semántica introducida en HTML5, diseñada específicamente para agrupar enlaces de navegación importantes.


Características Principales

Semántica: Ayuda a los motores de búsqueda y lectores de pantalla a identificar secciones de navegación.

Flexibilidad: Puede colocarse en cualquier parte del documento HTML, como dentro de <header> o <footer>.

Estilización: Se puede personalizar fácilmente con CSS para adaptarse al diseño del sitio.


ARCHIVO A LAS 14:56:


<head>


<title> Curso de programación </title>



</head>


<body>
<header id="arriba">
<h1> Curso de programación de aplicaciones </h1>

<nav>
<ul>
<li> <a href="#html"> HTML </a></li>
<li> <a href="#css">  CSS </a></li>
<li> <a href="#php"> PHP </a></li>
<li> <a href="#js"> JS </a></li>
<li> <a href="#bbdd"> Bases de datos </a></li>
<li> <a href="#sql"> SQL </a></li>
<li> <a href="#proyectos"> Proyectos </a></li>
</ul>

</nav>


</header>
<main>
<section id="html"> 
<h2> HTML <a href="#arriba"> Ir arriba</a> <a href="html/cv/cv.zip"> Descargar </a></h2>    
<ul>
    
    <li> Ejercicios </li>

</ul>
</section>

<section id="css"> 
<h2> CSS <a href="#arriba"> Ir arriba </a> <a href="html/cv/cv.zip"> Descargar </a></h2>    
<ul>
    
    <li>Ejercicios </li>

</ul>
</section>

<section id="php"> 
<h2> PHP <a href="#arriba"> Ir arriba</a></h2>    
<ul>
    
    <li> Ejercicios </li>

</ul>
</section>

<section id="js"> 
<h2> JS <a href="#arriba"> Ir arriba </a></h2>    
<ul>
    
    <li> Ejercicios </li>

</ul>
</section>

<section id="bbdd"> 
<h2> Bases de datos <a href="#arriba"> Ir arriba </a></h2>    
<ul>
    
    <li> Ejercicios </li>

</ul>
</section>

<section id="sql"> 
<h2> SQL <a href="#arriba"> Ir arriba </a></h2>    
<ul>
    
    <li> Ejercicios </li>

</ul>
</section>

<section id="proyectos"> 
<h2> Proyectos <a href="#arriba"> Ir arriba </a></h2>    
<ul>
    
    <li> Ejercicios </li>

</ul>
</section>

</main>


</body>


*** Día 14/10/2025


html-fotos con el inicial-ciudades con fotos e index



audio controls: para sacar los controles de audio
audio autoplay: para que suene el audio de fondo, sin controles
source para seleccionar el archivo de audio

style.css
link rel="stylesheet" href="style.css"
... es para dar colores a fondos y textos (los textos según el color que definamos a cada etiqueta en style.css: h1{}, h2{}...)


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Álbum de ciudades</title>
</head>
<body>
    
<header>
<h1> Álbum de ciudades </h1>

<img src="tierra-og.webp"  width="20%"  alt="El planeta">
</header>

<main>
<section> 
    
<ul>
    
    <li>  <a href="arroyo"> Arroyo De La Luz </a> </li>
    <li>  <a href="evanston/"> Evanston - Illinois </a> </li>
    <li>  <a href="estambul"> Estambul </a> </li>

</ul>
</section>



</main>





</body>
</html>










<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> Evanston </title>
</head>
<body>
    
<header>
<h1> Evanston: Fountain Square </h1>

<ul>
    
    <li>  <a href="../arroyo/"> Arroyo De La Luz </a> </li>
    <li>  <a href="../evanston/"> Evanston - Illinois </a> </li>
    <li>  <a href="../estambul"> Estambul </a> </li>

</ul>

<img src="fotos/Fountain_Square_Evanston.jpg" alt="Fountain Square" width="50%">
</header>

<main>
<section> 
    
<ul>
    
    <li>  <a href="index.html"> Anterior </a> </li>
    <li>  <a href="luxury.html"> Siguiente </a> </li>

</ul>
</section>



</main>





</body>
</html>


*** Día 15/10/2025


html/tablas/1/index.html



table border="1"

thead
th
/thead

tbody
tr que incluye td's       


A SABER POR AHORA:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> La primera tabla</title>
</head>
<body>

    <h1> La primera tabla</h1>
    <h1> Su pedido </h1>
    <table border="1">

<thead>
<th></th>
</thead>

<tbody>
<tr>

    <td></td>

</tr>



</tbody>

</table>
</body>
</html>



CREO QUE SÍ:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> La primera tabla</title>
</head>

<body>

    <h1> La primera tabla</h1>
    <h1> Su pedido </h1>
    <table border="1">

        <thead>
            <tr>
                <th>Nombre producto</th>
                <th>Precio unitario</th>
                <th>Unidades</th>
                <th>Subtotal</th>

            </tr>
        </thead>

        <tbody>
            <tr>
                <td>Reproductor MP3 (80 GB)</td>
                <td>192.02</td>
                <td>1</td>
                <td>195.02</td>
            </tr>

            <tr>
                <td>Fundas de colores</td>
                <td>2.50</td>
                <td>5</td>
                <td>12.50</td>
            </tr>
            <tr>
                <td>Reproductor de radio & control remoto</td>
                <td>12.99</td>
                <td>1</td>
                <td>12.99</td>
            </tr>


        </tbody>

        <tfoot>
            <tr>
                <th>TOTAL</th>
                <th>-</th>
                <th>7</th>
                <th>207.51</th>
            </tr>
        </tfoot>


    </table>
</body>

</html>



colspan="n" hacia la derecha
rowspan="n" hacia abajo
n es el número de columnas que zampas+1. Es decir, el total que quieres montar
caption bajo table es el título de la tabla

TABLA MAL:
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> Análisis de ventas</title>
</head>

<body>

    <h1> Análisis de ventas</h1>

    <table border="1">
        <caption> Análisis de ventas anuales </caption>
        <thead>
            <tr>
                <th colspan="1">AÑO</th>
                <th rowspan="3"> Expansión de ventas</th>

            </tr>

            <tr>

                <th> Producto <br> A</th>
                <th> Producto <br> B</th>
                <th> Producto <br> C</th>
                <th> Producto <br> D</th>
            </tr>

        </thead>

        <tbody>
            <tr>
                <td>N-3</td>
                <td>-</td>
                <td>-</td>
                <td>-</td>
                <td>-</td>
            </tr>

            <tr>
                <td>N-2</td>
                <td>3</td>
                <td>5</td>
                <td>8</td>
                <td>4</td>
            </tr>
            <tr>
                <td>N-1</td>
                <td>4</td>
                <td>4</td>
                <td>7</td>
                <td>7</td>
            </tr>
            <tr>
                <td>N</td>
                <td>5</td>
                <td>7</td>
                <td>6</td>
                <td>2</td>
            </tr>


        </tbody>

        <tfoot>
            <tr>
                <th colspan="1">AÑO</th>
                <th> Producto <br> A</th>
                <th> Producto <br> B</th>
                <th> Producto <br> C</th>
                <th> Producto <br> D</th>
            </tr>

            <tr>

                <th rowspan="3"> Expansión de ventas</th>

            </tr>


        </tfoot>


    </table>
</body>

</html>




TABLA BIEN QUE NO:
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> Análisis de ventas</title>
</head>

<body>

    <h1> Análisis de ventas</h1>

    <table border="1">
        <caption> Análisis de ventas anuales </caption>
        <thead>
            <tr>
                <th rowspan="1">AÑO</th>
                <th colspan="3"> Expansión de ventas</th>

            </tr>

            <tr>

                <th> Producto <br> A</th>
                <th> Producto <br> B</th>
                <th> Producto <br> C</th>
                <th> Producto <br> D</th>
            </tr>

        </thead>

        <tbody>
            <tr>
                <td>N-3</td>
                <td>-</td>
                <td>-</td>
                <td>-</td>
                <td>-</td>
            </tr>

            <tr>
                <td>N-2</td>
                <td>3</td>
                <td>5</td>
                <td>8</td>
                <td>4</td>
            </tr>
            <tr>
                <td>N-1</td>
                <td>4</td>
                <td>4</td>
                <td>7</td>
                <td>7</td>
            </tr>
            <tr>
                <td>N</td>
                <td>5</td>
                <td>7</td>
                <td>6</td>
                <td>2</td>
            </tr>


        </tbody>

        <tfoot>
            <tr>
                <th rowspan="1">AÑO</th>
                <th> Producto <br> A</th>
                <th> Producto <br> B</th>
                <th> Producto <br> C</th>
                <th> Producto <br> D</th>
            </tr>

            <tr>

                <th colspan="3"> Expansión de ventas</th>

            </tr>


        </tfoot>


    </table>
</body>

</html>


TABLA ALTERADA:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> Análisis de ventas</title>
</head>

<body>

    <h1> Análisis de ventas</h1>

    <table border="1">
        <caption> Análisis de ventas anuales </caption>

        <tbody>
            <tr>
                <th rowspan="1">AÑO</th>
                <th colspan="3"> Expansión de ventas</th>

            </tr>

            <tr>
                <th></th>
                <th> Producto <br> A</th>
                <th> Producto <br> B</th>
                <th> Producto <br> C</th>
                <th> Producto <br> D</th>
            </tr>



            <tr>
                <td>N-3</td>
                <td>-</td>
                <td>-</td>
                <td>-</td>
                <td>-</td>
            </tr>

            <tr>
                <td>N-2</td>
                <td>3</td>
                <td>5</td>
                <td>8</td>
                <td>4</td>
            </tr>
            <tr>
                <td>N-1</td>
                <td>4</td>
                <td>4</td>
                <td>7</td>
                <td>7</td>
            </tr>
            <tr>
                <td>N</td>
                <td>5</td>
                <td>7</td>
                <td>6</td>
                <td>2</td>
            </tr>

            <tr>
                <th rowspan="1">AÑO</th>
                <th> Producto <br> A</th>
                <th> Producto <br> B</th>
                <th> Producto <br> C</th>
                <th> Producto <br> D</th>
            </tr>

            <tr>

                <th colspan="3"> Expansión de ventas</th>

            </tr>


        </tbody>



    </table>
</body>

</html>

TABLA BIEN:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> Análisis de ventas</title>
</head>

<body>

    <h1> Análisis de ventas</h1>

    <table border="1">
        <caption> Análisis de ventas anuales </caption>

        <thead>
            <tr>
                <th rowspan="2">AÑO</th>
                <th colspan="4"> Expansión de ventas</th>

            </tr>

            <tr>
                
                <th> Producto <br> A</th>
                <th> Producto <br> B</th>
                <th> Producto <br> C</th>
                <th> Producto <br> D</th>
            </tr>



        </thead>


        <tbody>



            <tr>
                <td>N-3</td>
                <td>-</td>
                <td>-</td>
                <td>-</td>
                <td>-</td>
            </tr>

            <tr>
                <td>N-2</td>
                <td>3</td>
                <td>5</td>
                <td>8</td>
                <td>4</td>
            </tr>
            <tr>
                <td>N-1</td>
                <td>4</td>
                <td>4</td>
                <td>7</td>
                <td>7</td>
            </tr>
            <tr>
                <td>N</td>
                <td>5</td>
                <td>7</td>
                <td>6</td>
                <td>2</td>
            </tr>



        </tbody>

        <tfoot>
            <tr>
                <th rowspan="2">AÑO</th>
                <th> Producto <br> A</th>
                <th> Producto <br> B</th>
                <th> Producto <br> C</th>
                <th> Producto <br> D</th>
            </tr>

            <tr>

                <th colspan="4"> Expansión de ventas</th>

            </tr>



        </tfoot>


    </table>
</body>

</html>


Multicursor:
VS Code supports multiple cursors for fast simultaneous edits. You can add secondary cursors (rendered thinner) with Alt+Click. Each cursor operates independently based on the context it sits in. A common way to add more cursors is with Shift+Alt+Down or Shift+Alt+Up that insert cursors below or above.

VS Code admite varios cursores para realizar ediciones simultáneas rápidas. Puedes agregar cursores secundarios (más delgados) con Alt+Clic . Cada cursor funciona de forma independiente según el contexto. Una forma común de agregar más cursores es con Mayús+Alt+Abajo o Mayús+Alt+Arriba, que insertan cursores arriba o abajo.

ESC y fuera


Marcar etiqueta a modificar para seleccionar y apretar Ctrl+D hasta donde quieras llegar a la modificación. luego corriges uno y corriges todo

****************

Python tiene muchas librerías descargables, y eso genera dependencias. Se usa en IA, aunque no sea el mejor
En robótica se usa C++
Cordova es Apache, sirve para generar aplicaciones para móviles

Web responsiva: lo que lleva al móvil es un acceso directo a la web, así no ocupa sitio en el móvil y sólo se desarrolla el código una vez

********************

33: el código se puede modificar desde aquí, pero de forma local


*** Día 16/10/2025

Modelos de negocio

Empleado, por ETT o por cliente final
Autónomo, para clientes o para tu producto
Montar una empresa
Opositar

Factura de autónomo:
Base
IVA si se factura a persona física
Del beneficio se paga el 16% de IRPF

https://sede.agenciatributaria.gob.es/Sede/ayuda/manuales-videos-folletos/manuales-practicos/folleto-actividades-economicas/5-impuesto-sobre-valor-anadido/5_1-actividades-exentas-iva.html

https://grupobelmar.es/news/Year_2017/News_20170530.html

Si se factura a empresas:
Base
IVA
IRPF si se facturan servicios, 16% (ese 16% sobre la base va en negativo, los paga la empresa en mi nombre)

La cuota de autónomos cubre la SSocial. Se paga una cuota mensual y año y medio o dos después te regularizan

Revisar eso de que los tp puedan considerarse como tc en la vida laboral, por si puedo moverlo

Módulos VS estimación directa
Módulos VS Verifactu

Es preferible que los gastos que imputes vayan en factura a tu nombre



Hacienda ha sacado un software gratuito para Verifactu

La factura electrónica no tuvo relevancia más allá de la Administración

3. Montar una sociedad
Al menos uno de los socios tiene que ser autónomo
Lo normal es empezar por una SLU, de capital social mínimo 3000 (60000 para una SA)

Orden de responsabilidades: Hacienda - Bancos - Empresas - Personas

Las sociedades tienen IS, no IRPF. Tiene el 25% fijo, sin tramos
El reparto de beneficios lleva el 18% de impuesto de transmisiones

4. Oposiciones

---------------------------------

En 20 falta un *

Alt+ratón... multicursor aleatorio
Ctrl+Mays y vertical hacia abajo
Seleccionar un rango y Ctl+D para ir a los siguientes

Para deshacerlos ESC o pinchar en cualquier parte

Live server para renderizar sin servidor, con F5... aunque no sirve para todos los casos


https://javier.avisando.com/html/tablas/3.png

https://developer.mozilla.org/es/docs/Web/HTML/Reference/Elements/input/checkbox
... es para decirnos que el recuadrito es un <input type="checkbox"> 

MI PROYECTO:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Tabla 3</title>
</head>

<body>
<h2> Redes sociales</h2>
    <table border="1">
        <thead>
            <tr>
                <th colspan="2"> Nombre </th>

                <th> ¿Tengo cuenta? </th>
                <th> Valoración</th>
                <th> Dirección </th>
            </tr>


        </thead>

        <tbody>
            <tr>
                <td rowspan="2"> Facebook </td>
                <td rowspan="2"><img src="pENh3y_2Pnw.png" width="50%"></td>
                <td rowspan="2"> <img
                        src="gratis-png-casilla-de-verificacion-marca-de-verificacion-cuadro-de-texto.png" width="10%"></td>
                <td><img src="rating-3d-concept-five-yellow-260nw-2520828163.webp" width="70%"></td>
                <td rowspan="2"> <a href="https://facebook.es">https://facebook.es</a></td>

            </tr>
            <tr>
                <td>2.5/5</td>
            </tr>

            <tr>
                <td rowspan="2"> Flickr </td>
                <td rowspan="2"><img src="pENh3y_2Pnw.png" width="50%"></td>
                <td rowspan="2"> <img
                        src="gratis-png-casilla-de-verificacion-marca-de-verificacion-cuadro-de-texto.png" width="10%"></td>
                <td><img src="rating-3d-concept-five-yellow-260nw-2520828163.webp" width="70%"></td>
                <td rowspan="2"><a href="https://flickr.es">https://flickr.es</a></td>

            </tr>
            <tr>
                <td>2.5/5</td>
            </tr>

            <tr>
                <td rowspan="2"> X </td>
                <td rowspan="2"><img src="pENh3y_2Pnw.png" width="50%"></td>
                <td rowspan="2"> <img
                        src="gratis-png-casilla-de-verificacion-marca-de-verificacion-cuadro-de-texto.png" width="10%"></td>
                <td><img src="rating-3d-concept-five-yellow-260nw-2520828163.webp" width="70%"></td>
                <td rowspan="2"><a href="https://x.es">https://x.es</a></td>

            </tr>
            <tr>
                <td>2.5/5</td>
            </tr>



        </tbody>







    </table>


</body>

</html>


*** Día 17/10/2025

17/10/2025

style = "width: 150px;", va dentro del img para limitar la imagen a 150 pixeles

input type="checkbox"

45 para ponerle un espacio antes de la tabla sin CSS, lo de body style="padding: 80px;"

input type="checkbox", "text", "number", "submit"... a las tres primeras les pone name, a la última value

name es un atributo sólo de componentes de formulario, es para ponerle un nombre a cada checkbox

title es para la etiqueta de la imagen; alt es para una descripción interna, por ejemplo de cara a los buscadores


Las técnicas SEO son técnicas de posicionamiento

La idea es que el alt sea lo más extenso y claro posible, y si va dentro de por ejemplo un h2 destaca más, que el title sea claro y de palabras no muy usadas...

drones, drones... ¿y TE?

https://javier.avisando.com/html/tablas/4.png

  <table style="border-spacing: 10px;">, para que las líneas vacías no queden muy pegadas... yo le meto un br y me sale igual
Alfonso propone un &nbsp;

MI PROYECTO PARA ESO:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Tabla Factura</title>
</head>

<body>
    <h2> Tablas complejas</h2>
    <br><br>

    <table border="1">
        <caption> Lorem ipsum dolor sit amet consectetur adipisicing elit. Est perferendis, ut, rem odit autem quae, deleniti </caption>
        <thead>
            <tr>
                <th rowspan="5" colspan="2"> SUPERMERCADOS <br> "LA VENDEDORA" </th>

                <th colspan="2"> </th>

                <th>25/04/2011 </th>
            </tr>

            <tr>
                <th colspan="3"> Nº Fac 245400 </th>
            </tr>

            <tr>
                <th> Cliente</th>
                <td colspan="2" rowspan="2"> Juan Francisco <br> 45454545 <br> Avenida de los Pendejos 28 </td>

            </tr>
            <tr>
                <th> RUC </th>

            </tr>
            <tr>
                <th> Dirección</th>

            </tr>

            <tr>
                <th>CÓDIGO </th>
                <th> CANTIDAD</th>
                <th> CONCEPTO </th>
                <th> PRECIO </th>
                <th> IMPORTE </th>
            </tr>



        </thead>

        <tbody>

            <tr>
                <td> A23</td>
                <td> 20</td>
                <td> LÁPICES</td>
                <td> 25</td>
                <td> 300</td>
            </tr>


            <tr>
                <td> A45</td>
                <td> 100</td>
                <td> BORRADORES</td>
                <td> 10</td>
                <td> 1000</td>
            </tr>

            <tr>
                <td> <br> </td>
                <td> </td>
                <td> </td>
                <td> </td>
                <td> </td>
            </tr>

            <tr>
                <td> <br> </td>
                <td> </td>
                <td> </td>
                <td> </td>
                <td> </td>
            </tr>

            <tr>
                <td> <br> </td>
                <td> </td>
                <td> </td>
                <td> </td>
                <td> </td>
            </tr>



        </tbody>

        <tfoot>

            <tr>
                <th colspan="3"> </th>
                <th> Importe </th>
                <th>  1500</th>
            </tr>

            <tr>
                <th colspan="3"> </th>
                <th>  Descuento</th>
                <th>  75</th>
            </tr>

            <tr>
                <th colspan="3"> </th>
                <th> Total</th>
                <th> 1425</th>
            </tr>

            <tr>
                <th colspan="3"> </th>
                <th> IVA</th>
                <th> 228</th>
            </tr>


            <tr>
                <th colspan="4">  TOTAL FACTURA </th>
                <th> 1653 </th>
            </tr>


        </tfoot>




    </table>




</body>

</html>




    <table border="1" style="width: 100%;">… imagino que será para hacer la tabla más ancha, para que ocupe todo el ancho de la web






229: DOM es el árbol que forma todo el HTML

… y en la tabla le mete arrays y subarrays


*** Día 20/10/2025

20/10/2025

Los formularios son una herramienta esencial
Las casillas son etiquetas HTML

<form action="" method=""> </form>
7: los formularios de método post son los más habituales
<form action="guardar.php" method="post"> </form>

Los textos que usemos no serán muy largos, es un formulario
Cada input debe llevar su nombre exclusivo, no puede empezar por un número, no puede llevar espacios ni caracteres especiales o tildes...

input type="text" nombre="nombre" id="nombre" placeholder="Su nombre" required
El placeholder es una muestra que va dentro de la casilla del formulario
required va en los campos obligatorios


<label for "nombre"> Su nombre </label>, para poner un título frente a la casilla

input type="submit" value="Enviar" para formar un botón de envío

input type="text" nombre="nombre" id="nombre" placeholder="Su nombre" required minlength="4" maxlength="50"

input type="button" value="Borrar" genera un botón sin más, sin acción
13: Para botones también podemos usar <button>

input type="reset" te devuelve a los valores iniciales indicados en la etiqueta value del input

15: <fieldset> seguido de un <legend>... y luego de una <ul> con varios checkbox
El primero genera un recuadro, y el legend su título

Los checkbox no clicados no se mandan

20: Ctrl+Espacio nos abre las opciones del type del input
datetime es la fecha y hora del servidor, la otra es la local

25, 26: en cada navegador o SO se ve de una forma diferente
27: la fecha se envía en formato anglosajón

El input de tipo radio es un checkbox de círculo
32: llevan el mismo name porque sólo puedes enviar una opción de las tres

value se refiere al valor que se envía en el caso de marcar la opción

36: input de tipo password, se oculta lo que escribes, aunque luego se recibe en texto plano

Un input de tipo mail es para introducir mails, el de tipo color es para seleccionar colores y la selección también varía según el navegador

El de tipo hidden le tenemos oculto, no le ve el usuario. Es para enviar información que no vea el usuario

input:file para generar un input de tipo fie, para seleccionar ficheros
43: necesitamos añadir eso para que se envíe esta información, que será binaria. Para binario el formulario deberá ser de tipo post

input de tipo number para meter números
49: step para forzar saltos de 5 en 5, por ejemplo
minlength es para letras, min para números

50: range genera la barra... luego añadiremos el marco de valores en JavaScript

65: textarea es para textos largos, un recuadro grande

72: select es un desplegable para elegir

El formulario podría hacerse con una tabla, pero él prefiere hacer eso por CSS

85: su página como muestra de lo de las fotos y para esto que ha hecho




** Que Oli ha abierto el json y en la configuración del overtype le salía block en vez de line... ver en whatsapp


https://javier.avisando.com/html/tablas/5.png

11 filas y 10 columnas, y creo que una tabla interna


tr*11>td*10


Y en 109 lo tengo así:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <table border="1">

        <tr>
            <td colspan="2">&nbsp;<br></td>

            <td><br></td>
            <td><br></td>
            <td><br></td>
            <td><br></td>
            <td rowspan="3"> <br></td>
            <td><br></td>
            <td><br></td>
            <td><br></td>
        </tr>
        <tr>
            <td><br></td>
            <td rowspan="10"><br></td>
            <td colspan="3" rowspan="2"><br></td>


            <td><br></td>

            <td><br></td>
            <td><br></td>
            <td><br></td>
        </tr>
        <tr>
            <td><br></td>




            <td><br></td>

            <td><br></td>
            <td><br></td>
            <td><br></td>
        </tr>
        <tr>
            <td><br></td>

            <td><br></td>
            <td><br></td>
            <td><br></td>
            <td rowspan="4" colspan="4"><br></td>



            <td><br></td>
        </tr>
        <tr>
            <td><br></td>

            <td><br></td>
            <td><br></td>
            <td><br></td>




            <td><br></td>
        </tr>
        <tr>
            <td><br></td>

            <td><br></td>
            <td><br></td>
            <td><br></td>




            <td><br></td>
        </tr>
        <tr>
            <td><br></td>

            <td colspan="2" rowspan="5">
                <table>


                    <tr>
                        <td></td>
                        <td></td>
                        <td></td>
                        <td></td>
                        <td></td>
                    </tr>

                    <tr>
                        <td></td>
                        <td colspan="3" rowspan="3"></td>


                        <td></td>
                    </tr>

                    <tr>
                        <td></td>



                        <td></td>
                    </tr>
                    <tr>
                        <td></td>



                        <td></td>
                    </tr>
                    <tr>
                        <td></td>
                        <td></td>
                        <td></td>
                        <td></td>
                        <td></td>
                    </tr>



                </table>





            </td>

            <td><br></td>




            <td><br></td>
        </tr>
        <tr>
            <td><br></td>



            <td><br></td>
            <td><br></td>
            <td><br></td>
            <td><br></td>
            <td rowspan="4"><br></td>
            <td><br></td>
        </tr>
        <tr>
            <td rowspan="3"><br></td>



            <td rowspan="3"><br></td>
            <td rowspan="3"><br></td>
            <td rowspan="3"><br></td>
            <td rowspan="3"><br></td>

            <td rowspan="3"><br></td>
        </tr>
        <tr>










        </tr>
        <tr>










        </tr>






    </table>



</body>

</html>


En 112 añado   <table border="1" style="width: 100%;"> y llego a:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <table border="1" style="width: 100%;">

        <tr>
            <td colspan="2">&nbsp;<br></td>

            <td><br></td>
            <td><br></td>
            <td><br></td>
            <td><br></td>
            <td rowspan="3"> <br></td>
            <td><br></td>
            <td><br></td>
            <td><br></td>
        </tr>
        <tr>
            <td><br></td>
            <td rowspan="10"><br></td>
            <td colspan="3" rowspan="2"><br></td>


            <td><br></td>

            <td><br></td>
            <td><br></td>
            <td><br></td>
        </tr>
        <tr>
            <td><br></td>




            <td><br></td>

            <td><br></td>
            <td><br></td>
            <td><br></td>
        </tr>
        <tr>
            <td><br></td>

            <td><br></td>
            <td><br></td>
            <td><br></td>
            <td rowspan="4" colspan="4"><br></td>



            <td><br></td>
        </tr>
        <tr>
            <td><br></td>

            <td><br></td>
            <td><br></td>
            <td><br></td>




            <td><br></td>
        </tr>
        <tr>
            <td><br></td>

            <td><br></td>
            <td><br></td>
            <td><br></td>




            <td><br></td>
        </tr>
        <tr>
            <td><br></td>

            <td colspan="2" rowspan="5">
                <table>


                    <tr>
                        <td></td>
                        <td></td>
                        <td></td>
                        <td></td>
                        <td></td>
                    </tr>

                    <tr>
                        <td></td>
                        <td colspan="3" rowspan="3"></td>


                        <td></td>
                    </tr>

                    <tr>
                        <td></td>



                        <td></td>
                    </tr>
                    <tr>
                        <td></td>



                        <td></td>
                    </tr>
                    <tr>
                        <td></td>
                        <td></td>
                        <td></td>
                        <td></td>
                        <td></td>
                    </tr>



                </table>





            </td>

            <td><br></td>




            <td><br></td>
        </tr>
        <tr>
            <td><br></td>



            <td><br></td>
            <td><br></td>
            <td><br></td>
            <td><br></td>
            <td rowspan="4"><br></td>
            <td><br></td>
        </tr>
        <tr>
            <td rowspan="3"><br></td>



            <td rowspan="3"><br></td>
            <td rowspan="3"><br></td>
            <td rowspan="3"><br></td>
            <td rowspan="3"><br></td>

            <td rowspan="3"><br></td>
        </tr>
        <tr>










        </tr>
        <tr>










        </tr>






    </table>



</body>

</html>



114 con el <table border="1"> en la segunda tabla

115 pasando a <table border="1" style="width: 100%;">

Enlace de lista de vídeos del profesor:
https://www.youtube.com/watch?v=xGIRTT9VMs0&list=PLSWUh43W7_OOUOrhjrR_QS_nKpnpdqNU-





html/formularios/1/index.html

El id en el input sirve para identificarlo después en su label correspondiente

162 lo aplico de esta forma:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Formulario de acceso</title>
</head>

<body>


    <h1> LOGIN </h1>
    <form action="acceso.php" method="post">
        <input type="mail" nombre="mail" id="mail" placeholder="Su correo" required>
        <input type="password" nombre="password" id="password" placeholder="Contraseña" required> <br><br>
        <a href=""> Forgot to password? </a><br><br>
        <input type="submit" value="Register">
        <input type="button" value="SIGN IN">

    </form>


</body>

</html>


https://javier.avisando.com/html/formularios/1.png




*** Día 21/10/2025


20/10/2025

Los formularios son una herramienta esencial
Las casillas son etiquetas HTML

<form action="" method=""> </form>
7: los formularios de método post son los más habituales
<form action="guardar.php" method="post"> </form>

Los textos que usemos no serán muy largos, es un formulario
Cada input debe llevar su nombre exclusivo, no puede empezar por un número, no puede llevar espacios ni caracteres especiales o tildes...

input type="text" nombre="nombre" id="nombre" placeholder="Su nombre" required
El placeholder es una muestra que va dentro de la casilla del formulario
required va en los campos obligatorios


<label for "nombre"> Su nombre </label>, para poner un título frente a la casilla

input type="submit" value="Enviar" para formar un botón de envío

input type="text" nombre="nombre" id="nombre" placeholder="Su nombre" required minlength="4" maxlength="50"

input type="button" value="Borrar" genera un botón sin más, sin acción
13: Para botones también podemos usar <button>

input type="reset" te devuelve a los valores iniciales indicados en la etiqueta value del input

15: <fieldset> seguido de un <legend>... y luego de una <ul> con varios checkbox
El primero genera un recuadro, y el legend su título

Los checkbox no clicados no se mandan

20: Ctrl+Espacio nos abre las opciones del type del input
datetime es la fecha y hora del servidor, la otra es la local

25, 26: en cada navegador o SO se ve de una forma diferente
27: la fecha se envía en formato anglosajón

El input de tipo radio es un checkbox de círculo
32: llevan el mismo name porque sólo puedes enviar una opción de las tres

value se refiere al valor que se envía en el caso de marcar la opción

36: input de tipo password, se oculta lo que escribes, aunque luego se recibe en texto plano

Un input de tipo mail es para introducir mails, el de tipo color es para seleccionar colores y la selección también varía según el navegador

El de tipo hidden le tenemos oculto, no le ve el usuario. Es para enviar información que no vea el usuario

input:file para generar un input de tipo file, para seleccionar ficheros
43: necesitamos añadir eso para que se envíe esta información, que será binaria. Para binario el formulario deberá ser de tipo post

input de tipo number para meter números
49: step para forzar saltos de 5 en 5, por ejemplo
minlength es para letras, min para números

50: range genera la barra... luego añadiremos el marco de valores en JavaScript

65: textarea es para textos largos, un recuadro grande

72: select es un desplegable para elegir

El formulario podría hacerse con una tabla, pero él prefiere hacer eso por CSS




21-Oct-2025


html/formularios/2/index.html

https://developer.mozilla.org/es/docs/Web/HTML/Reference/Elements/textarea:
<textarea name="textarea" rows="10" cols="50">Write something here</textarea>

Los comentarios en HTML se crean con la sintaxis <!-- ... -->. Se utilizan para añadir notas explicativas en el código que no se muestran en la página web, lo que ayuda a documentar el código, organizar secciones grandes o desactivar temporalmente código. Para comentar varias líneas, se aplica la misma estructura de inicio y fin a todo el bloque
... o seleccionar todo el bloque y Ctrl+Mays+A



********************************** Integro las direcciones

… parece que también me queda comprimir los descargables, ok

1. Lo del CV:
<section id="html"> 
<h2> Ejercicios HTML <a href="#arriba"> Ir arriba</a> </h2>    
<ul>
    
    <li>   <a href="html/cv/index.html"> CV apresurado </a>  <a href="html/cv/cv.zip"> Descargar </a> </li>

Su respectivo retorno: 
<a href="../../index.html"> Página principal </a>


2. Los álbumes de fotos:
Ida: 
    <li>   <a href="html/fotos/index.html"> Álbum de fotos </a>  <a href="html/fotos/fotos.zip"> Descargar </a> </li>
** Duda: ¿comprimo el álbum entero? Creo que sí. ¿Entonces necesitamos enlaces de cada subalbum a su index?
Vuelta: <a href="../../index.html"> Página principal </a>

3. Tabla 1:
Ida:     <li>   <a href="html/tablas/1/index.html"> Tabla simple </a>  <a href="html/tablas/1/1.zip"> Descargar </a> </li>
Vuelta: <a href="../../../index.html"> Página principal </a>

4. Tabla 2:
Ida:     <li>   <a href="html/tablas/2/index.html"> Tabla de análisis de ventas </a>  <a href="html/tablas/2/2.zip"> Descargar </a> </li>
Vuelta: <a href="../../../index.html"> Página principal </a>

5. Tabla 3:
Ida:     <li>   <a href="html/tablas/3/index.html"> Listado de redes sociales </a>  <a href="html/tablas/3/3.zip"> Descargar </a> </li>
Vuelta: <a href="../../../index.html"> Página principal </a>

6. Tabla 4:
Ida:     <li>   <a href="html/tablas/4/index.html"> Tabla factura </a>  <a href="html/tablas/4/4.zip"> Descargar </a> </li>
Vuelta: <a href="../../../index.html"> Página principal </a>



<li> <a href="#html"> HTML </a>
<ol>
<li>   <a href="html/cv/index.html"> CV apresurado </a>  <a href="html/cv/cv.zip"> Descargar </a> </li>
<li>   <a href="html/fotos/index.html"> Álbum de fotos </a>  <a href="html/fotos/fotos.zip"> Descargar </a> </li>
<li>   <a href="html/tablas/1/index.html"> Tabla simple </a>  <a href="html/tablas/1/1.zip"> Descargar </a> </li>
<li>   <a href="html/tablas/2/index.html"> Tabla de análisis de ventas </a>  <a href="html/tablas/2/2.zip"> 
<li>   <a href="html/tablas/3/index.html"> Listado de redes sociales </a>  <a href="html/tablas/3/3.zip"></a>
<li>   <a href="html/tablas/4/index.html"> Tabla factura </a>  <a href="html/tablas/4/4.zip"> Descargar </a> </li>
<li>   <a href="html/tablas/5/index.html"> Tabla recoveco </a>  <a href="html/tablas/5/5.zip"> Descargar </a> </li>
<li>   <a href="html/formularios/1/index.html"> Formulario simple </a>  <a href="html/formularios/1/1.zip"> Descargar </a> 
<li>   <a href="html/formularios/2/index.html"> Formulario CV </a>  <a href="html/formularios/2/2.zip"> Descargar </a> 
</ol>

</li>



… parece que también me queda comprimir los descargables, ok, y lo de los subálbumes si acaso
Descargables creo que ok


****************************************

<link rel="stylesheet" href="style.css"> y luego en el style.css los colorines "por etiquetas"
(Tal vez ya tenga esto, pero lo pillo de nuevo)

*****************************************

La etiqueta de input es name, NO nombre como tengo puesto en el fichero de ayer



**********************************************

Aconsejable cerrar aplicaciones abiertas
Terminal
su-
apt update
apt upgrade

En PHP y Python es raro que deprecien instrucciones, pero con Java sí pasa

11: podemos ver qué incluyen las actualizaciones antes de actualizar
... podemos tirar de instantáneas o snapshots, también se usan en empresas servidores en espejo que prueban las actualizaciones antes de aplicarlas

15 el enctype="multipart/form-data" es para poder añadir ficheros

El teléfono mejor dejarlo como tipo text, el dni es text

En un input de tipo file usamos el accept para decirle qué tipos de archivo aceptamos (jpg...)

La carga útil (la información guardada) se puede enviar por post y get

El id sirve en CSS y JS, aquí lo que influye principalmente es el name

Get tiene un máximo de información y no admite binarios
40: cambiando la url se cambia la carga útil, lo que se envía

45: envío por get
48: si cambias la url cambias el resultado, no te hace falta el formulario


https://arturo.avisando.com/html/formularios/2/index.html
https://arturo.avisando.com/html/formularios/3/index.html


*** Día 22/10/2025


PROPUESTA INICIAL:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> Examen teórico </title>
</head>

<body>


    <form action="resultado.php" method="post">

        <fieldset>
            <legend> Datos personales </legend>

            Nombre <input type="text" name="nombre" id="nombre" placeholder="Su nombre" required minlength="10"
                maxlength="70"> <br>
            DNI <input type="text" name="dni" id="dni" placeholder="DNI" required min="8" max="9"> <br>
            Fecha <input type="date" name="fecha" id="fecha" placeholder="Su nombre" required> <br>

        </fieldset>



        <!--         Lista ordenada de preguntas y lista ordenada de radio -->

        <fieldset>

            <ol>

                <li>
                    <p> ¿Cuál es la respuesta a la pregunta 1? </p>
                    <img src="" style width="">
                    <ol>

                        <li> Arrancar <input type="radio" name="resp1"> </li>
                        <li> Frenar <input type="radio" name="resp1"> </li>
                        <li> Girar a la derecha <input type="radio" name="resp1"> </li>

                    </ol>


                </li>


            </ol>



        </fieldset>



    </form>

</body>

</html>






Layout es el diseño de la web
El header es un div "especializado", como el resto de etiquetas de 5

fontawesome.com tiene iconos gratuitos, aunque requieren de un css


link:css crea la instrucción hacia el fichero de estilo de forma automática

18: font-family se refiere a las fuentes
* se refiere a algoaplicable a todo el documento
En colorhunt.co tenemos paletas de colores compatibles
# para llamar a un id concreto
28: ya no se ve el icono
31 para comprimir la caja de 30

hover es cuando sitúas encima el ratón
padding es el margen interior

52 es para 53, para afectar sólo a los li directos, a los hijos
#preguntas > li

60: los números de las preguntas se los ha cargado el margen, se ve inspeccionando

Una class es un estilo particular

Funcionalidad, cuidado con salir de las tendencias más generales

Media query css, para dar otras circunstancias cuando el entorno cambia

75: estamos en el modo reactivo

86 no es derivado de 85, creo recordar

(En la media query sólo corregimos cosas, lo que no se toca se rige según el criterio general no modificado)

onclick es un evento que programamos en el js

101: en ordenador no se ve el menú

PHP es del lado del servidor, JS es del lado del cliente

20 GB, 2 GB RAM y 1 núcleo... 7 al mes en clouding
También están OVH...


107: lo marcado es como lo de abajo, pero sin vincularlo a la librería

cdn es un servidor simple pero que soporta muchas peticiones, es rápido, y más barato que otros

datatables.net

120 es un tipo de instrucción que sólo convierte cuando tienes toda la información cargada


*** Día 23/10/2025

23-OCT-2025

https://www.w3schools.com/html/html_layout.asp

<header> - Defines a header for a document or a section
<nav> - Defines a set of navigation links
<section> - Defines a section in a document
<article> - Defines independent, self-contained content
<aside> - Defines content aside from the content (like a sidebar)
<footer> - Defines a footer for a document or a section
<details> - Defines additional details that the user can open and close on demand
<summary> - Defines a heading for the <details> element


<header>- Define un encabezado para un documento o una sección
<nav>- Define un conjunto de enlaces de navegación.
<section>- Define una sección en un documento
<article>- Define contenido independiente y autónomo.
<aside>- Define contenido aparte del contenido (como una barra lateral)
<footer>- Define un pie de página para un documento o una sección
<details>- Define detalles adicionales que el usuario puede abrir y cerrar a pedido.
<summary>- Define un encabezado para el <details>elemento


http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/index.html


Inspeccionar la web
(Lo puedo poner en castellano en el Switch DevTools to Spanish)
En Elementos en la parte de arriba busco los .CSS y los elimino
Y ya tenemos "la esencia" de la web

<hr> para añadir una línea horizontal




Para crear una lista ordenada sin números en HTML, puedes crear una lista desordenada (<ul>) en su lugar, o usar CSS (list-style: none) en una lista ordenada (<ol>) para eliminar los marcadores. La forma más sencilla es usar la etiqueta <ul>, que por defecto muestra viñetas en lugar de números. 
Opción 1: Usar una lista desordenada (<ul>)
Esta es la forma más directa, ya que <ul> ya está diseñada para listas sin numeración automática. 
Code

<ul>
  <li>Elemento 1</li>
  <li>Elemento 2</li>
  <li>Elemento 3</li>
</ul>

Opción 2: Usar CSS para eliminar los números de una lista ordenada (<ol>)
Si necesitas la estructura de una lista ordenada (<ol>) por otras razones semánticas, puedes usar CSS para quitar los números. 
Añade una clase a tu lista en HTML:
Code

    <ol class="lista-sin-numeros">
      <li>Elemento 1</li>
      <li>Elemento 2</li>
      <li>Elemento 3</li>
    </ol>
Define el estilo en tu archivo CSS:
Code

    .lista-sin-numeros {
      list-style: none;
    }
list-style: none;: Esta propiedad CSS elimina por completo el marcador de cada elemento de la lista. 



https://www.w3schools.com/css/css_text_decoration.asp
The CSS text-decoration property is used to control the appearance of decorative lines on text



MI PROPUESTA DE HOY:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> Orange Pi Yo </title>
</head>

<body>

    <!-- <header>- Define un encabezado para un documento o una sección
<nav>- Define un conjunto de enlaces de navegación.
<section>- Define una sección en un documento
<article>- Define contenido independiente y autónomo.
<aside>- Define contenido aparte del contenido (como una barra lateral)
<footer>- Define un pie de página para un documento o una sección
<details>- Define detalles adicionales que el usuario puede abrir y cerrar a pedido.
<summary>- Define un encabezado para el <details>elemento
 -->

    <header>

        <ol>
            <li><a href="html/formularios/orange/logo.png"> <img src="html/formularios/orange/logo.png"> </a></li>
            <li><a href="#">Hardware</a></li>
            <li><a href="#">Software</a></li>
            <li><a href="#">Customized services</a></li>
            <li>News
                <ol>
                    <li><a href="#">Company News</a></li>
                    <li><a href="#">Video</a></li>
                    <li><a href="#">Events</a></li>


                </ol>


            </li>
            <li><a href="#">Forums</a></li>
            <li>About us

                <ol>
                    <li><a href="#">About Orange Pi</a></li>
                    <li><a href="#">About Recruitment</a></li>
                    <li><a href="#">Compliance&Integrity</a></li>


                </ol>


            </li>
            <li>Service&Download</li>

            <ol>
                <li><a href="#">Download</a></li>
                <li><a href="#">Github</a></li>
                <li><a href="#">Wiki</a></li>
                <li><a href="#">Third Party Images</a></li>

            </ol>

            <li><a href="#">EN CHI</a></li>
            <li><a href="#"></a></li>
        </ol>

    </header>

    <main>

        <section>

            <h1>Products</h1>
            <p></p>

            <article>

                <img src="html/formularios/orange/1.webp" width="45%">
                <h3>MicroPC</h3>
                <p> Es un MicroPC muy micro y tal</p>
                <a href="#"> More info </a>
                <!-- O esto o un button, pero me imagino que entrará por CSS -->

            </article>


        </section>

        <section>

            <h1>Computers and microcontrollers</h1>
            <p></p>

            <article>

                <img src="html/formularios/orange/1.webp" width="45%">
                <h3>MicroPC</h3>
                <p> Es un MicroPC muy micro y tal</p>
                <a href="#"> More info </a>
                <!-- O esto o un button, pero me imagino que entrará por CSS -->

            </article>


        </section>

        <section>

            <h1> Power supplies and cables </h1>
            <p></p>

            <article>

                <img src="html/formularios/orange/1.webp" width="45%">
                <h3>MicroPC</h3>
                <p> Es un MicroPC muy micro y tal</p>
                <a href="#"> More info </a>
                <!-- O esto o un button, pero me imagino que entrará por CSS -->

            </article>


        </section>

        <section>

            <h1>Cases</h1>
            <p></p>

            <article>

                <img src="html/formularios/orange/1.webp" width="45%">
                <h3>MicroPC</h3>
                <p> Es un MicroPC muy micro y tal</p>
                <a href="#"> More info </a>
                <!-- O esto o un button, pero me imagino que entrará por CSS -->

            </article>


        </section>

        <section>

            <h1>Cameras</h1>
            <p></p>

            <article>

                <img src="html/formularios/orange/1.webp" width="45%">
                <h3>MicroPC</h3>
                <p> Es un MicroPC muy micro y tal</p>
                <a href="#"> More info </a>
                <!-- O esto o un button, pero me imagino que entrará por CSS -->

            </article>


        </section>

        <section>

            <h1>Other accessories</h1>
            <p></p>

            <article>

                <img src="html/formularios/orange/1.webp" width="45%">
                <h3>MicroPC</h3>
                <p> Es un MicroPC muy micro y tal</p>
                <a href="#"> More info </a>
                <!-- O esto o un button, pero me imagino que entrará por CSS -->

            </article>


        </section>




    </main>
    <footer>

        <ol>
            <li> About Orange Pi
                <ol>
                    <li><a href="#">About us</a></li>
                    <li><a href="#">Contact us</a></li>

                </ol>
            </li>
            <li>Orange Pi Store 
                <ol>
                    <li> AliExpress- 
                        <ol>
                            <li><a href="#">Link 1 </a></li>
                            <li><a href="#">Link 2 </a></li>
                            <li><a href="#">Link 3 </a></li>
                        </ol>


                    </li>
                    <li> Amazon- <a href="#">Link1</a></li>
                   
                </ol>
            </li>
            <li> Service & Support
                <ol>
                    <li><a href="#">Documentation</a></li>
                    <li><a href="#">Downloads</a></li>
                    
                </ol>
            </li>
            <li> Contact us
                <ol>
                    <li>Tel: (86)0755-26765483</li>
                    <li>Email:zhao_steven@263.net (Consulting service)</li>
                    <li>Teams: Zhao Steven</li>
                    <li>Teams: zhaoyifan@orange-pi.onaliyun.com</li>
                </ol>
            </li>
            <li> Follow us 
                <ol>
                    <li><a href="#">Twitter</a></li>
                    <li><a href="#">Facebook</a></li>
                    <li><a href="#">YouTube</a></li>
                    <li><a href="#">Instagram</a></li>
                </ol>
            </li>
            <li> Social group 
                <ol>
                    <li><a href="#">Telegram Group 1</a></li>
                    <li><a href="#">Telegram Group 2</a></li>
                    <li><a href="#">Facebook Group 1</a></li>
                    <li><a href="#">Facebook Group 2</a></li>
                    <li><a href="#">Facebook Group 3</a></li>
                    <li><a href="#">Discord</a></li>
                </ol>
            </li>
        </ol>

        
    </footer>

</body>

</html>


*** Día 24/10/2025

24-OCT-2025

https://www.todocoleccion.net/billetes-espanoles/1926-espana-13-billetes-50-pesetas-madrid-15-agosto-serie-c-pintor-velazquez~x190152932

https://www.todocoleccion.net/billetes-espanoles/apresto-serie-e-4776034-bonito-100-pesetas-9-enero-1940-banco-espana-madrid~x200020991

Raspberry o placas de desarrollo

59 es el ESP32, para temas domóticos
64 es un relé de dos vías (un interruptor que trabaja entre dos tensiones)
66 es un sensor de obstáculos

Los lenguajes actuales se basan en C y C++

Los cursos de autómatas son bastante caros
Es mejor empezar por los cursos de Arduino

luisllamas.es/cursos/

Emuladores de ESP32... 75 es C
Un loop es un bucle sin fin

88 es micropython
94: no te deja mostrar contenido http no seguro en una web segura https

bmp, jpg, webp es mejor en fotos porque cada pixel lleva un color
Las imágenes vectoriales (png, svg) van mejor para logos, donde no hay muchos colores. Las puedes escalar, cambiar de tamaño, porque no se van a difuminar
jpg, svg es lo mejor, según el caso

Es bueno cambiar el tamaño de la imagen en las no vectoriales, ajustándola a lo que vas a presentar. El tamaño más pequeño carga antes.

img es una etiqueta de tipo no caja, no ocupa todo el ancho del contenido

119: especifica el padding 0 por si se ve la página en otros navegadores que lo apliquen
122 es cargar un tipo de letra... pero eso ocupa recursos, es mejor usar tipos de letra comunes
123: se puede recurrir a las Google fonts, y así no descarga nada la web... pero es mejor usar fuentes comunes, también con ellas la gente está más habituada a verlas y no confunde unas letras con otras

136: la selección de grid que haces inspeccionando muestra código que puedes copiar hacia el css
137 a 139: definición y uso de variables

145 es una seudoclase, para cuando pasamos el ratón por encima
148 era con un background color para ver la caja del main, luego la quita
153: el padding es el margen interior

.grillagrande ataca a esa clase

158: falla porque la imagen es demasiado grande

160: width aquí es para que la imagen se ajuste al 100% de los disponible, y el gap genera espacios

169 es atacar al hijo 2 del article, y así en 170 lo separa


INDEX INICIAL:
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">

<title> Curso de programación </title>



</head>


<body>
<header id="arriba">
<h1> Curso de programación de aplicaciones </h1>

<nav>
<ul>
<li> <a href="#html"> HTML </a>
<ol>
<li>   <a href="html/cv/index.html"> CV apresurado </a>  <a href="html/cv/cv.zip"> Descargar </a> </li>
<li>   <a href="html/fotos/index.html"> Álbum de fotos </a>  <a href="html/fotos/fotos.zip"> Descargar </a> </li>
<li>   <a href="html/tablas/1/index.html"> Tabla simple </a>  <a href="html/tablas/1/1.zip"> Descargar </a> </li>
<li>   <a href="html/tablas/2/index.html"> Tabla de análisis de ventas </a>  <a href="html/tablas/2/2.zip"> 
<li>   <a href="html/tablas/3/index.html"> Listado de redes sociales </a>  <a href="html/tablas/3/3.zip"></a>
<li>   <a href="html/tablas/4/index.html"> Tabla factura </a>  <a href="html/tablas/4/4.zip"> Descargar </a> </li>
<li>   <a href="html/tablas/5/index.html"> Tabla recoveco </a>  <a href="html/tablas/5/5.zip"> Descargar </a> </li>
<li>   <a href="html/formularios/1/index.html"> Formulario simple </a>  <a href="html/formularios/1/1.zip"> Descargar </a> </li>
<li>   <a href="html/formularios/2/index.html"> Formulario CV </a>  <a href="html/formularios/2/2.zip"> Descargar </a> </li>
</ol>

</li>
<li> <a href="#css">  CSS </a></li>
<li> <a href="#php"> PHP </a></li>
<li> <a href="#js"> JS </a></li>
<li> <a href="#bbdd"> Bases de datos </a></li>
<li> <a href="#sql"> SQL </a></li>
<li> <a href="#proyectos"> Proyectos </a></li>
</ul>

</nav>


</header>
<main>
<section id="html"> 
<h2> HTML <a href="#arriba"> Ir arriba</a> <a href="html/cv/cv.zip"> Descargar </a></h2>    
<ul>
    
    <li> Ejercicios </li>

</ul>
</section>

<section id="css"> 
<h2> CSS <a href="#arriba"> Ir arriba </a> <a href="html/cv/cv.zip"> Descargar </a></h2>    
<ul>
    
    <li>Ejercicios </li>

</ul>
</section>

<section id="php"> 
<h2> PHP <a href="#arriba"> Ir arriba</a></h2>    
<ul>
    
    <li> Ejercicios </li>

</ul>
</section>

<section id="js"> 
<h2> JS <a href="#arriba"> Ir arriba </a></h2>    
<ul>
    
    <li> Ejercicios </li>

</ul>
</section>

<section id="bbdd"> 
<h2> Bases de datos <a href="#arriba"> Ir arriba </a></h2>    
<ul>
    
    <li> Ejercicios </li>

</ul>
</section>

<section id="sql"> 
<h2> SQL <a href="#arriba"> Ir arriba </a></h2>    
<ul>
    
    <li> Ejercicios </li>

</ul>
</section>

<section id="proyectos"> 
<h2> Proyectos <a href="#arriba"> Ir arriba </a></h2>    
<ul>
    
    <li> Ejercicios </li>

</ul>
</section>

</main>


</body>
</html>


*** Día 27/10/2025

Acredita Madrid para revisar y conseguir certificados de profesionalidad

38 y 39 para poner la reina en lugar del icono existente

Podemos complementar esta formación con redes, seguridad, diseño... dentro de los cursos del sepe, también ciberseguridad sería un buen complemento

42: en Platzi hay bastantes cursos

Los cursos privados suelen ser bastante caros

49: apt install gimp para instalar el programa de mnipulación de imágenes gimp (es gratuito), o a través de la tienda/centro de aplicaciones

main>section>ol>li>a:last-child :hover { no funcionaba... otra vez por el ctrl+f5

Mi CSS hasta ahora es:

header>nav>ul>li>a{
text-decoration: none;

}


header>nav>ul>li{
display: inline-block;

}


header{
text-align: center;

}

main>section>ol>li>a:first-child {

text-decoration: none;

}

main>section>ol>li>a:last-child:hover {

color: red;

}




Creo que la web era http://www.orangepi.org/html/hardWare/computerAndMicrocontrollers/index.html

Mi punto de partida sin CSS era este:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> Orange Pi Yo </title>
</head>

<body>

    <!-- <header>- Define un encabezado para un documento o una sección
<nav>- Define un conjunto de enlaces de navegación.
<section>- Define una sección en un documento
<article>- Define contenido independiente y autónomo.
<aside>- Define contenido aparte del contenido (como una barra lateral)
<footer>- Define un pie de página para un documento o una sección
<details>- Define detalles adicionales que el usuario puede abrir y cerrar a pedido.
<summary>- Define un encabezado para el <details>elemento
 -->

    <header>

        <ol>
            <li><a href="formularios/orange/logo.png"> <img src="formularios/orange/logo.png"> </a></li>
            <li><a href="#">Hardware</a></li>
            <li><a href="#">Software</a></li>
            <li><a href="#">Customized services</a></li>
            <li>News
                <ol>
                    <li><a href="#">Company News</a></li>
                    <li><a href="#">Video</a></li>
                    <li><a href="#">Events</a></li>


                </ol>


            </li>
            <li><a href="#">Forums</a></li>
            <li>About us

                <ol>
                    <li><a href="#">About Orange Pi</a></li>
                    <li><a href="#">About Recruitment</a></li>
                    <li><a href="#">Compliance&Integrity</a></li>


                </ol>


            </li>
            <li>Service&Download</li>

            <ol>
                <li><a href="#">Download</a></li>
                <li><a href="#">Github</a></li>
                <li><a href="#">Wiki</a></li>
                <li><a href="#">Third Party Images</a></li>

            </ol>

            <li><a href="#">EN CHI</a></li>
            <li><a href="#"></a></li>
        </ol>

    </header>

    <main>

        <section>

            <h1>Products</h1>
            <p></p>

            <article>

                <img src="formularios/orange/1.webp" width="45%">
                <h3>MicroPC</h3>
                <p> Es un MicroPC muy micro y tal</p>
                <a href="#"> More info </a>
                <!-- O esto o un button, pero me imagino que entrará por CSS -->

            </article>


        </section>

        <section>

            <h1>Computers and microcontrollers</h1>
            <p></p>

            <article>

                <img src="formularios/orange/1.webp" width="45%">
                <h3>MicroPC</h3>
                <p> Es un MicroPC muy micro y tal</p>
                <a href="#"> More info </a>
                <!-- O esto o un button, pero me imagino que entrará por CSS -->

            </article>


        </section>

        <section>

            <h1> Power supplies and cables </h1>
            <p></p>

            <article>

                <img src="formularios/orange/1.webp" width="45%">
                <h3>MicroPC</h3>
                <p> Es un MicroPC muy micro y tal</p>
                <a href="#"> More info </a>
                <!-- O esto o un button, pero me imagino que entrará por CSS -->

            </article>


        </section>

        <section>

            <h1>Cases</h1>
            <p></p>

            <article>

                <img src="formularios/orange/1.webp" width="45%">
                <h3>MicroPC</h3>
                <p> Es un MicroPC muy micro y tal</p>
                <a href="#"> More info </a>
                <!-- O esto o un button, pero me imagino que entrará por CSS -->

            </article>


        </section>

        <section>

            <h1>Cameras</h1>
            <p></p>

            <article>

                <img src="formularios/orange/1.webp" width="45%">
                <h3>MicroPC</h3>
                <p> Es un MicroPC muy micro y tal</p>
                <a href="#"> More info </a>
                <!-- O esto o un button, pero me imagino que entrará por CSS -->

            </article>


        </section>

        <section>

            <h1>Other accessories</h1>
            <p></p>

            <article>

                <img src="formularios/orange/1.webp" width="45%">
                <h3>MicroPC</h3>
                <p> Es un MicroPC muy micro y tal</p>
                <a href="#"> More info </a>
                <!-- O esto o un button, pero me imagino que entrará por CSS -->

            </article>


        </section>




    </main>
    <footer>

        <ol>
            <li> About Orange Pi
                <ol>
                    <li><a href="#">About us</a></li>
                    <li><a href="#">Contact us</a></li>

                </ol>
            </li>
            <li>Orange Pi Store 
                <ol>
                    <li> AliExpress- 
                        <ol>
                            <li><a href="#">Link 1 </a></li>
                            <li><a href="#">Link 2 </a></li>
                            <li><a href="#">Link 3 </a></li>
                        </ol>


                    </li>
                    <li> Amazon- <a href="#">Link1</a></li>
                   
                </ol>
            </li>
            <li> Service & Support
                <ol>
                    <li><a href="#">Documentation</a></li>
                    <li><a href="#">Downloads</a></li>
                    
                </ol>
            </li>
            <li> Contact us
                <ol>
                    <li>Tel: (86)0755-26765483</li>
                    <li>Email:zhao_steven@263.net (Consulting service)</li>
                    <li>Teams: Zhao Steven</li>
                    <li>Teams: zhaoyifan@orange-pi.onaliyun.com</li>
                </ol>
            </li>
            <li> Follow us 
                <ol>
                    <li><a href="#">Twitter</a></li>
                    <li><a href="#">Facebook</a></li>
                    <li><a href="#">YouTube</a></li>
                    <li><a href="#">Instagram</a></li>
                </ol>
            </li>
            <li> Social group 
                <ol>
                    <li><a href="#">Telegram Group 1</a></li>
                    <li><a href="#">Telegram Group 2</a></li>
                    <li><a href="#">Facebook Group 1</a></li>
                    <li><a href="#">Facebook Group 2</a></li>
                    <li><a href="#">Facebook Group 3</a></li>
                    <li><a href="#">Discord</a></li>
                </ol>
            </li>
        </ol>

        
    </footer>

</body>

</html>



https://cssgenerator.org/box-shadow-css-generator.html

box-shadow: 6px 5px 0px 0px rgba(0,0,0,0.75);
-webkit-box-shadow: 6px 5px 0px 0px rgba(0,0,0,0.75);
-moz-box-shadow: 6px 5px 0px 0px rgba(0,0,0,0.75);

CSS PRIMER PASO:

header {
    display: grid;

}


header>ol>li {

    display: inline-block;

}

header>ol>li>a {
    text-decoration: none;
    color: black;
}

header>ol>li>ol>li>a {
    text-decoration: none;
    color: grey;

}


header>ol>li:hover {
    color: orange;

}

header>ol>li>a:hover {
    color: orange;

}

header>ol>li>ol>li>a:hover {
    color: orange;

}

main>section>h1 {
    background-color: orange;
    color: white;
}

main>section>article {

    box-shadow: 6px 5px 0px 0px rgba(0, 0, 0, 0.75);
    -webkit-box-shadow: 6px 5px 0px 0px rgba(0, 0, 0, 0.75);
    -moz-box-shadow: 6px 5px 0px 0px rgba(0, 0, 0, 0.75);


}

main>section>article>a {

    background-color: orange;
    color: white;
    text-decoration: none;

}

main>section>article>a:hover {

    background-color: white;
    color: orange;
    text-decoration: none;
    border: 1px orange;
    padding-bottom: 20px;
}






Sorprendentemente esto me mueve todo hacia la derecha, incluida la imagen
article{

    text-align: right;
}


FICHERO BASE A LAS 15:00:
<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> Orange Pi Yo </title>
    <link rel="stylesheet" href="orangepi.css">
</head>

<body>

    <!-- <header>- Define un encabezado para un documento o una sección
<nav>- Define un conjunto de enlaces de navegación.
<section>- Define una sección en un documento
<article>- Define contenido independiente y autónomo.
<aside>- Define contenido aparte del contenido (como una barra lateral)
<footer>- Define un pie de página para un documento o una sección
<details>- Define detalles adicionales que el usuario puede abrir y cerrar a pedido.
<summary>- Define un encabezado para el <details>elemento
 -->

    <header>

        <ol>
            <li><a href="formularios/orange/logo.png"> <img src="formularios/orange/logo.png"> </a></li>
            <li><a href="#">Hardware</a></li>
            <li><a href="#">Software</a></li>
            <li><a href="#">Customized services</a></li>
            <li>News
                <ol>
                    <li><a href="#">Company News</a></li>
                    <li><a href="#">Video</a></li>
                    <li><a href="#">Events</a></li>


                </ol>


            </li>
            <li><a href="#">Forums</a></li>
            <li>About us

                <ol>
                    <li><a href="#">About Orange Pi</a></li>
                    <li><a href="#">About Recruitment</a></li>
                    <li><a href="#">Compliance&Integrity</a></li>


                </ol>


            </li>
            <li>Service&Download</li>

            <ol>
                <li><a href="#">Download</a></li>
                <li><a href="#">Github</a></li>
                <li><a href="#">Wiki</a></li>
                <li><a href="#">Third Party Images</a></li>

            </ol>

            <li><a href="#">EN CHI</a></li>
            <li><a href="#"></a></li>
        </ol>

    </header>

    <main>

        <section>

            <h1>Products</h1>
            <p></p>

            <article>

                <img src="formularios/orange/1.webp" width="45%">
                <h3>MicroPC</h3>
                <p> Es un MicroPC muy micro y tal</p>
                <a href="#"> More info </a>
                <!-- O esto o un button, pero me imagino que entrará por CSS -->

            </article>


        </section>

        <section>

            <h1>Computers and microcontrollers</h1>
            <p></p>

            <article>

                <img src="formularios/orange/1.webp" width="45%">
                <h3>MicroPC</h3>
                <p> Es un MicroPC muy micro y tal</p>
                <a href="#"> More info </a>
                <!-- O esto o un button, pero me imagino que entrará por CSS -->

            </article>


        </section>

        <section>

            <h1> Power supplies and cables </h1>
            <p></p>

            <article>

                <img src="formularios/orange/1.webp" width="45%">
                <h3>MicroPC</h3>
                <p> Es un MicroPC muy micro y tal</p>
                <a href="#"> More info </a>
                <!-- O esto o un button, pero me imagino que entrará por CSS -->

            </article>


        </section>

        <section>

            <h1>Cases</h1>
            <p></p>

            <article>

                <img src="formularios/orange/1.webp" width="45%">
                <h3>MicroPC</h3>
                <p> Es un MicroPC muy micro y tal</p>
                <a href="#"> More info </a>
                <!-- O esto o un button, pero me imagino que entrará por CSS -->

            </article>


        </section>

        <section>

            <h1>Cameras</h1>
            <p></p>

            <article>

                <img src="formularios/orange/1.webp" width="45%">
                <h3>MicroPC</h3>
                <p> Es un MicroPC muy micro y tal</p>
                <a href="#"> More info </a>
                <!-- O esto o un button, pero me imagino que entrará por CSS -->

            </article>


        </section>

        <section>

            <h1>Other accessories</h1>
            <p></p>

            <article>

                <img src="formularios/orange/1.webp" width="45%">
                <h3>MicroPC</h3>
                <p> Es un MicroPC muy micro y tal</p>
                <a href="#"> More info </a>
                <!-- O esto o un button, pero me imagino que entrará por CSS -->

            </article>


        </section>




    </main>
    <footer>
        <nav>
            <ol>
                <li> About Orange Pi
                    <ol>
                        <li><a href="#">About us</a></li>
                        <li><a href="#">Contact us</a></li>

                    </ol>
                </li>
                <li>Orange Pi Store
                    <ol>
                        <li> AliExpress-
                            <ol>
                                <li><a href="#">Link 1 </a></li>
                                <li><a href="#">Link 2 </a></li>
                                <li><a href="#">Link 3 </a></li>
                            </ol>


                        </li>
                        <li> Amazon- <a href="#">Link1</a></li>

                    </ol>
                </li>
                <li> Service & Support
                    <ol>
                        <li><a href="#">Documentation</a></li>
                        <li><a href="#">Downloads</a></li>

                    </ol>
                </li>
                <li> Contact us
                    <ol>
                        <li><p>Tel: (86)0755-26765483</p></li>
                        <li><p>Email:zhao_steven@263.net (Consulting service)</p></li>
                        <li><p>Teams: Zhao Steven</p></li>
                        <li><p>Teams: zhaoyifan@orange-pi.onaliyun.com</p></li>
                    </ol>
                </li>
            </ol>
        </nav>
        <nav>
            <ol>
                <li> Follow us
                    <ol>
                        <li><a href="#">Twitter</a></li>
                        <li><a href="#">Facebook</a></li>
                        <li><a href="#">YouTube</a></li>
                        <li><a href="#">Instagram</a></li>
                    </ol>
                </li>
                <li> Social group
                    <ol>
                        <li><a href="#">Telegram Group 1</a></li>
                        <li><a href="#">Telegram Group 2</a></li>
                        <li><a href="#">Facebook Group 1</a></li>
                        <li><a href="#">Facebook Group 2</a></li>
                        <li><a href="#">Facebook Group 3</a></li>
                        <li><a href="#">Discord</a></li>
                    </ol>
                </li>
            </ol>
        </nav>

    </footer>

</body>

</html>


CSS BASE A LAS 15:00

header {
    display: grid;

}


header>ol>li {

    display: inline-block;

}

header>ol>li>a {
    text-decoration: none;
    color: black;
}

header>ol>li>ol>li>a {
    text-decoration: none;
    color: grey;

}


header>ol>li:hover {
    color: orange;

}

header>ol>li>a:hover {
    color: orange;

}

header>ol>li>ol>li>a:hover {
    color: orange;

}

main>section>h1 {
    background-color: orange;
    color: white;
}

main>section>article {

    box-shadow: 6px 5px 0px 0px rgba(0, 0, 0, 0.75);
    -webkit-box-shadow: 6px 5px 0px 0px rgba(0, 0, 0, 0.75);
    -moz-box-shadow: 6px 5px 0px 0px rgba(0, 0, 0, 0.75);


}

main>section>article>a {

    background-color: orange;
    color: white;
    text-decoration: none;

}

main>section>article>a:hover {

    background-color: white;
    color: orange;
    text-decoration: none;
    border: 1px orange;
    padding-bottom: 20px;
}


footer{
background-color: rgb(247, 244, 244);

}


footer a {
    text-decoration: none;
    color: grey;
}

footer a:hover {

    color: orange;

}

/* Y aquí decido dividir el footer inicial */

footer p {
    color: grey;

}

footer>nav:first-child>ol>li {

    display: inline-block;
}


footer>nav:first-child>ol>li>ol>li:first-child>ol>li {
    display: inline-block;
}

footer>nav:last-child {

    border-top: 2px solid black;
}

footer>nav:last-child>ol>li>ol>li {


    display: inline-block;
}

article h3{

    text-align: right;
}


*** Día 28/10/2025

https://lenguajecss.com/

ul, table, div pueden tener tanto class como id, y ambos son atacables desde CSS
(eL ID con # (21), la clase con ., antes del nombre)

link rel funciona igual que la etiqueta <style>, aunque esto es menos aconsejable. En esa etiqueta podemos meter instrucciones de CSS
También podríamos usar por ejemplo <body style="border:5 px;">, y sería más directo
Lo que tendrá prioridad será lo último en llegar, esto que es más directo, pero es menos aconsejable
Es mejor hacerlo por CSS porque se puede aplicar a varias hojas y tienes todo el estilo concentrado, también tarda menos en cargar el bloque porque el CSS es un fichero cacheable

Podemos encontrar archivos CSS en carpetas assets, css, includes... también podemos llamarla como queramos

onsen.io tiene ficheros de estilo para web móviles. Es para html y JS

https://onsen.io/v2/api/js/ons-tabbar.html
https://onsen.io/v2/api/js/ons-toolbar.html

Cursos de tipo 3 son los buenos (ver en imágenes de ayer)

Para aprovechar ciberseguridad hay que tener conocimientos de redes, programación, bbdd y SO
Caliminus: debian vitaminado
Hay que usar SO actualizados, contraseñas fuertes...

tarjetas blancas, lector, grabador... sólo te faltaría el PIN

19: gana especificidad antes que el último en llegar... y el !important a los dos

RGBA es RGB aplicando transparencias/opacidad... no sale en 26, pero estaría arriba. 27 es el hexadecimal (base 16)
Hay más colores en hexadecimal

strong * ataca a todos los elementos dentro del strong

40: unimos con comas dos etiquetas para darles el mismo estilo

list-style es para el estilo de los puntos de la lista, en este caso ul

55: aplicar el 1% se ajusta más al cambio de pantallas que usar 1px

En el :root almacenaremos variables y funciones

70: efecto en Firefox de una fuente desconocida para él... podemos meter la fuente dentro del proyecto y luego decirle en el CSS la ruta (73, hasta 77)
Es mejor usar fuentes de fonts.google.com, que ya están cacheadas (hasta 84)

Las impresoras de inyección van por ppp, puntos por pulgada

90: viewport: espacio visible disponible en ese momento
Se usa para móviles o para fijar algo arriba o abajo

El tamaño de los pixels dependen de cada pantalla

El tamaño de fuente por defecto suele ser 14px


*** Día 29/10/2025



1 em es el valor por defecto de la fuente
1,2 em es una fuente un 20% más grande

Con rem podemos darle un valor por defecto diferente a la fuente, darle una nueva base al em
Vemos uso en 21 y 22, primero se da un valor por defecto y luego se usan medidas en rem's: 2rem, 3rem... El valor por defecto se puede dar en el root o en un html del CSS
Nos aconseja usar em

Si no se pone ninguna medida a una imagen te la coge en pixels

CSS y JS tienen diferencias entre navegadores (32 entre chrome y firefox)

Desde 23: primero se aplica el width del 100% a un body del 75%, después un 75% del viewport

10vh es un 10% del ancho visible (30 al mover la ventana se mueve el texto)

35, 36: @media sirve para que detecte dispositivos diferentes
@media print: propiedades cuando se imprime


Lo más común en los diseños es usar porcentajes, para que sean adaptables a su entorno

overflow es qué queremos que pase cuando el texto o la imagen sobrepasan su caja (46)
(no hará overflow en medidas auto)

margin en porcentaje es respecto a la página

ancho de la caja = su width + padding + margin + bordes
(Si no se especifica el width de una caja toma el 100%)

box-siring: border-box; evita desbordamientos, aunque no tiene en cuenta los márgenes del body (49)
Es aconsejable usarlo para un buen ajuste

border sin estilo aplica solid por defecto
border-radius es para bordes redondeados

Firefox renderiza mejor las webs, pero es más usado Chrome



Coste del dominio: 9 anuales aprox

https://www.microsoft.com/es-es/edge/update/141?form=MT00ZZ&channel=stable&version=141.0.3537.99&cs=2415330555

Para posicionamientos:
En h1 y strong lo importante
Que te vinculen en otras páginas


*** Día 30/10/2025

Lo de ayer me quedó un poco ahí al principio

30-OCT-2025

La caja p siempre ocupa el 100% por defecto. No lleva padding, border ni margin
Con el box-siring le decimos que para ese 100% tenga en cuenta el padding (no el margin)
Las cajas siempre hacen que lo siguiente vaya debajo

Para alinear cajas hay varias formas:

- Antes se hacía con una tabla, pero no es flexible para móviles
- Sistema float (flotabilidad), flotabilidad de cajas en el viewport
- Sistema flex, en el que se dividía el viewport en columnas con un display=flex y los elementos se iban colocando solos
Aquí al pasar a móvil dividías el viewport en menos columnas
- Usando grid, la división es en filas y columnas y los elementos se colocan solos


5: Separación entre líneas y columnas es el gap

25 y 26: 1fr 1fr 1fr implica que cada cuadro ocupará un tercio del grid
También podemos hacer 2fr 1fr 1fr

30: el grid crecerá de forma automática si aumentan los elementos
33, 34: auto sólo aplicará scroll cuando excede el texto

overflow-x sólo pone scroll horizontal con imágenes o con textos largos sin espacios

46 con un gap: 10 px;

Hasta 53: forma de alinear a partir de la inspección del estado anterior

62: no se ve el sexto lorem porque no entra en el header

Tras 84 quitamos el gap de los 15px

Mejor usar siempre medidas relativas, y aquí fracciones

Hasta 130: en la web saca scroll horizontal aunque en la realidad no... y en Firefox también va bien

136 tiene tres padding, que los otros dos complementan al primero

margin: auto sólo afecta a izquierda y derecha

También puedes definir cada celda del grid de una forma, con un nombre según su tipo... y luego llenarlo con lo que necesites según ese tipo (logo, publicidad...)




Menú arriba
Menú a la derecha
Footer con 3 imágenes
Body:
Una zona con 2 select y el icono de filtrar
Luego artículos.. con título, texto, imagen a la derecha y "Ver más" justo debajo

Paleta de colores o degradado de sólo uno en diferentes tonos

colorhunt.co



https://developer.mozilla.org/es/docs/Web/HTML/Reference/Elements/select


*** Día 31/10/2025

31-OCT-2025

Menú arriba
Menú a la derecha
Footer con 3 imágenes
Body:
Una zona con 2 select y el icono de filtrar
Luego artículos.. con título, texto, imagen a la derecha y "Ver más" justo debajo

Paleta de colores o degradado de sólo uno en diferentes tonos

colorhunt.co

https://developer.mozilla.org/es/docs/Web/HTML/Reference/Elements/select


https://www.elcorteingles.es/electronica/A54961514-portatil-lg-gram-16z90ru-i5-1334u-16gb-512gb-ssd-16-w11/?utm_medium=cpc&utm_source=google&utm_campaign=eci_cyo_tecinformatica_gads_sem_promocion_20250901-20260228_pla_perf_61992&utm_content=na&utm_term=na&gclsrc=aw.ds&gad_source=1&gad_campaignid=19971247175&gbraid=0AAAAAD_jRp2WEkl3tY1ClAyzqQZPjIacr&gclid=Cj0KCQjwvJHIBhCgARIsAEQnWlBGLtARufjzv4j0VNxTUTVRFQYcaMhrHQrcjJOY9NJh3yhSkxQG1n8aAp_SEALw_wcB

https://www.asus.com/es/laptops/for-home/zenbook/

https://www.asus.com/es/laptops/for-home/zenbook/asus-zenbook-s-16-um5606/


arturo.avisando.com/css/grid1



Con la distribución de 32 no me hace el segundo grid, parece ser que por el br… luego Alfonso me lo articula así, quitando el br que yo tenía entre los dos div del main y metiéndole el section que yo no tenía:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="style.css">
</head>

<body>

    <header>

        <ol>
            <li>Lorem, apsum <a href="#"></a></li>
            <li>Lorem, epsum <a href="#"></a></li>
            <li>Lorem, ipsum <a href="#"></a></li>
            <li>Lorem, opsum <a href="#"></a></li>
            <li>Lorem, upsum <a href="#"></a></li>


        </ol>

    </header>


    <main>


        <div>
            <select name="select">
                <option value="value1" selected>Value 1</option>
                <option value="value2">Value 2</option>
                <option value="value3">Value 3</option>
            </select>

            <select name="select">
                <option value="value1" selected>Más caro</option>
                <option value="value2">Más barato</option>
                <option value="value3">Más verde</option>
            </select>
            <img src="no lo sé todavía">


        </div>

        <div>
            <section>
                <article>

                    <h3> Article 1</h3>

                    <div>
                        <div>
                            <p> Lorem ipsum dolor, sit amet consectetur adipisicing elit. Sapiente minus possimus
                                perspiciatis
                                ad
                                commodi voluptatem. Quos tenetur non iusto illo!</p>
                        </div>
                        <div>
                            <img src="no lo sé todavía">
                            <a href="#"> Ver más </a>
                        </div>
                    </div>
                </article>


                <article>
                    <h3> Article 1</h3>

                    <div>
                        <div>
                            <p> Lorem ipsum dolor, sit amet consectetur adipisicing elit. Sapiente minus possimus
                                perspiciatis
                                ad
                                commodi voluptatem. Quos tenetur non iusto illo!</p>
                        </div>
                        <div>
                            <img src="no lo sé todavía">
                            <a href="#"> Ver más </a>
                        </div>
                    </div>
                </article>


                <article>
                    <h3> Article 1</h3>

                    <div>
                        <div>
                            <p> Lorem ipsum dolor, sit amet consectetur adipisicing elit. Sapiente minus possimus
                                perspiciatis
                                ad
                                commodi voluptatem. Quos tenetur non iusto illo!</p>
                        </div>
                        <div>
                            <img src="no lo sé todavía">
                            <a href="#"> Ver más </a>
                        </div>
                    </div>
                </article>

                <article>
                    <h3> Article 1</h3>

                    <div>
                        <div>
                            <p> Lorem ipsum dolor, sit amet consectetur adipisicing elit. Sapiente minus possimus
                                perspiciatis
                                ad
                                commodi voluptatem. Quos tenetur non iusto illo!</p>
                        </div>
                        <div>
                            <img src="no lo sé todavía">
                            <a href="#"> Ver más </a>
                        </div>
                    </div>
                </article>

            </section>

            <nav>
                <ol>
                    <li>Opción 1 <a href="#"></a></li>
                    <li>Opción 2 <a href="#"></a></li>
                    <li>Opción 3 <a href="#"></a></li>
                    <li>Opción 4 <a href="#"></a></li>
                    <li>Opción 5 <a href="#"></a></li>


                </ol>

            </nav>
        </div>

    </main>

    <footer>

        <a href="#"> <img src="publix"> </a>
        <a href="#"> <img src="publix"> </a>
        <a href="#"> <img src="publix"> </a>

    </footer>


</body>

</html>




Y el CSS:

* {
    box-sizing: border-box;

}

header>ol {


    display: grid;
    grid-template-columns: 1fr 1fr 1fr 1fr 1fr;

}


header>ol>li {



    list-style: none;

}



main {

    margin-top: 50px;
 /*    display: grid;
    grid-template-columns: 3fr 1fr; */

}


main>div:first-child {

    display: grid;
    grid-template-columns: 50% 40% 10%;

}

main>div:nth-child(2){
    display: grid;
    grid-template-columns: 80% 20%;

}

main>div>section{

    display: grid;
    grid-template-columns: 50% 50%;
}

main>div>section>article>div {
    display: grid;
    grid-template-columns: 50% 50%;
}




Código del curso de mañana:
FDEC240004454


justify-items para los elementos de un grid

Me quedan movilarlo y los colorines

CSS ya movilado:

* {
    box-sizing: border-box;

}

header>ol {


    display: grid;
    grid-template-columns: 1fr 1fr 1fr 1fr 1fr;

}


header>ol>li {



    list-style: none;

}


header li:hover {

    text-decoration: underline;

}


main {

    margin-top: 50px;
    /*    display: grid;
    grid-template-columns: 3fr 1fr; 
    Pasado a comentario por Alfonso */

}


main>div:first-child {

    display: grid;
    grid-template-columns: 50% 40% 10%;
    margin-bottom: 20px;
}

main>div:nth-child(2) {
    display: grid;
    grid-template-columns: 80% 20%;

}

main>div>section {

    display: grid;
    grid-template-columns: 50% 50%;
}

main>div>section>article>div {
    display: grid;
    grid-template-columns: 50% 50%;
}

article img {
    display: block;
    width: 150px;

}

article a {

    text-align: center;
    text-decoration: none;
}

article a:hover {

    text-decoration: underline;

}


/* 
nav ol{


    display: grid;
    grid-template-rows: repeat(5,1fr);

}
No me funciona y reactivo lo del margen */

nav li {

    list-style: none;
    margin-bottom: 50px;
}

nav li:hover {
    text-decoration: underline;

}


footer {
    margin-top: 40px;
    display: grid;
    grid-template-columns: 1fr 1fr 1fr;

}

footer img {

    /*     display: inline-block; */
    width: 100px;

}


@media (max-width: 500px) {

    main>div:nth-child(2) {

        grid-template-columns: 70% 30%;

    }



    main>div>section {

        grid-template-columns: 100%;
    }


}


https://us06web.zoom.us/j/81727356735



Coloreando:
84994F
FFE797
FCB53B
A72703


CSS coloreado:

* {
    box-sizing: border-box;

}


header {

    background-color: #84994F;

}


header>ol {


    display: grid;
    grid-template-columns: 1fr 1fr 1fr 1fr 1fr;

}


header>ol>li {



    list-style: none;

}


header li:hover {

    text-decoration: underline;

}


main {

    margin-top: 50px;
    /*    display: grid;
    grid-template-columns: 3fr 1fr; 
    Pasado a comentario por Alfonso */
    background-color: #FFE797;

}


main>div:first-child {

    display: grid;
    grid-template-columns: 50% 40% 10%;
    margin-bottom: 20px;
}

main>div:nth-child(2) {
    display: grid;
    grid-template-columns: 80% 20%;

}

main>div>section {

    display: grid;
    grid-template-columns: 50% 50%;
}

main>div>section>article>div {
    display: grid;
    grid-template-columns: 50% 50%;
}

article img {
    display: block;
    width: 150px;

}

article a {

    text-align: center;
    text-decoration: none;
}

article a:hover {

    text-decoration: underline;

}


nav {

    background-color: #FCB53B;

}

/* 
nav ol{


    display: grid;
    grid-template-rows: repeat(5,1fr);

}
No me funciona y reactivo lo del margen */

nav li {

    list-style: none;
    margin-bottom: 50px;
}

nav li:hover {
    text-decoration: underline;

}


footer {
    margin-top: 40px;
    display: grid;
    grid-template-columns: 1fr 1fr 1fr;
    background-color: #A72703;
}

footer img {

    /*     display: inline-block; */
    width: 100px;

}


@media (max-width: 500px) {

    main>div:nth-child(2) {

        grid-template-columns: 70% 30%;

    }



    main>div>section {

        grid-template-columns: 100%;
    }


}


Ah, mira, ponerle un height al header para que lo llene de colorcico
… y bajar el otro color del main al... ¿section? para dejar los desplegables libres de color


*** Día 03/11/2025



60 desemboca en 61
64 es por 65, 66 es cambiando la distribución según 67

ESTADO DEL CSS A 72:

* {
    box-sizing: border-box;

}


header {

    background-color: #84994F;
    height: 100px;
}


header>ol {


    display: grid;
    grid-template-columns: 1fr 1fr 1fr 1fr 1fr;

}


header>ol>li {



    list-style: none;

}


header li:hover {

    text-decoration: underline;

}


main {

    /*     margin-top: 50px; */
    /*    display: grid;
    grid-template-columns: 3fr 1fr; 
    Pasado a comentario por Alfonso */
    background-color: #FFE797;

}


main>div:first-child {

    display: grid;
    grid-template-columns: 50% 40% 10%;
    margin-bottom: 20px;
}

main>div:nth-child(2) {
    display: grid;
    grid-template-columns: 80% 20%;

}

main>div>section {

    display: grid;
    grid-template-columns: 50% 50%;
}

main>div>section>article>div {
    display: grid;
    grid-template-columns: 50% 50%;
}

article img {
    display: block;
    width: 150px;
    height: 140px;
}

article a {

    text-align: center;
    text-decoration: none;
}

article a:hover {

    text-decoration: underline;

}


nav {

    background-color: #FCB53B;

}

/* 
nav ol{


    display: grid;
    grid-template-rows: repeat(5,1fr);

}
No me funciona y reactivo lo del margen */

nav li {

    list-style: none;
    margin-bottom: 50px;
}

nav li:hover {
    text-decoration: underline;

}


footer {
    /*     margin-top: 40px; */
    display: grid;
    grid-template-columns: 1fr 1fr 1fr;
    background-color: #A72703;
}

footer img {

    /*     display: inline-block; */
    width: 100px;

}


@media (max-width: 500px) {

    main>div:nth-child(2) {

        grid-template-columns: 70% 30%;

    }



    main>div>section {

        grid-template-columns: 100%;
    }


}


La expresión comprimida 98 desemboca en 99

fontawesome.com por ejemplo para la imagen del filtro

113: color: inherit; es que te ponga el color heredado del padre

116 por 117 y la función calc para hacer un centrado vertical en el header
119 es otra forma de presentarlo

123 es por 124
126 es por 127

148 desemboca en 149, es otra forma de configurarlo

167 tras aplicar el #principal

Al footer le mete un div para que complete todo en negro. Tal vez en Firefox o Safari funcione mejor, aunque no le metamos el div adicional


Examen del JUEVES: test y luego intentar replicar una web


*** Día 04/11/2025


04 - OCT - 2025

https://www.microsoft.com/es-es/edge/update/141?form=MT00ZZ&channel=stable&version=141.0.3537.99&cs=2415330555

Inspeccionar también sale con F12
A día de hoy no es viable hacer máquinas virtuales de Apple

Al emular se envían y reciben encabezados... el user-agent es importante, es lo que nos identifica (aunque se puede modificar)
La emulación no es 100% el renderizado real del dispositivo seleccionado

Los navegadores que llevan las redes sociales no son reales, son emulaciones de funcionalidad limitada

Y 25 es Chrome tras cerrar y volver a abrirlo

RESULTADO DEL CSS A LAS 11:36:

* {
    box-sizing: border-box;

}


header {

    background-color: #84994F;
    height: 100px;
}


header>ol {


    display: grid;
    grid-template-columns: 1fr 1fr 1fr 1fr 1fr;

}


header>ol>li {



    list-style: none;

}


header li:hover {

    text-decoration: underline;

}


main {

    /*     margin-top: 50px; */
    /*    display: grid;
    grid-template-columns: 3fr 1fr; 
    Pasado a comentario por Alfonso */
    background-color: #FFE797;

}


main>div:first-child {

    display: grid;
    grid-template-columns: 50% 40% 10%;
    margin-bottom: 20px;
}

main>div:nth-child(2) {
    display: grid;
    grid-template-columns: 80% 20%;

}

main>div>section {

    display: grid;
    grid-template-columns: 50% 50%;
}

main>div>section>article>div {
    display: grid;
    grid-template-columns: 50% 50%;
}

article img {
    display: block;
    width: 150px;
    height: 140px;
}

article a {

    text-align: center;
    text-decoration: none;
}

article a:hover {

    text-decoration: underline;

}


nav {

    background-color: #FCB53B;

}

/* 
nav ol{


    display: grid;
    grid-template-rows: repeat(5,1fr);

}
No me funciona y reactivo lo del margen */

nav li {

    list-style: none;
    margin-bottom: 50px;
}

nav li:hover {
    text-decoration: underline;

}


footer {
    /*     margin-top: 40px; */
    display: grid;
    grid-template-columns: 1fr 1fr 1fr;
    background-color: #A72703;
}

footer img {

    /*     display: inline-block; */
    width: 100px;

}


@media (max-width: 500px) {

    main>div:nth-child(2) {

        grid-template-columns: 70% 30%;

    }

    /* Pasando de filas de dos artículos a filas de uno */

    main>div>section {

        grid-template-columns: 100%;
    }

    /* Partiendo cada artículo */

    /* main>div>section>article>div {
    
    grid-template-columns: 100%;
}
 */


}


Y EL INDEX:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Oboe con cuadro</title>
    <link rel="stylesheet" href="style.css">
</head>

<body>

    <header>

        <ol>
            <li>Lorem, apsum <a href="#"></a></li>
            <li>Lorem, epsum <a href="#"></a></li>
            <li>Lorem, ipsum <a href="#"></a></li>
            <li>Lorem, opsum <a href="#"></a></li>
            <li>Lorem, upsum <a href="#"></a></li>


        </ol>

    </header>


    <main>


        <div>
            <select name="select">
                <option value="value1" selected>Value 1</option>
                <option value="value2">Value 2</option>
                <option value="value3">Value 3</option>
            </select>

            <select name="select">
                <option value="value1" selected>Más caro</option>
                <option value="value2">Más barato</option>
                <option value="value3">Más verde</option>
            </select>
            <img src="ima/filter_menu_icon_135626.png" width="10%">


        </div>

        <div>
            <section>
                <article>

                    <h3> Article 1: violine</h3>

                    <div>
                        <div>
                            <p> Lorem ipsum dolor, sit amet consectetur adipisicing elit. Sapiente minus possimus
                                perspiciatis
                                ad
                                commodi voluptatem. Quos tenetur non iusto illo, vos Mozartino!</p>
                        </div>
                        <div>
                            <img src="ima/instrumentos-musicales-aislados_23-2151007016 violín.jpg">
                            <a href="#"> Ver más </a>
                        </div>
                    </div>
                </article>


                <article>
                    <h3> Article 2: flaute</h3>

                    <div>
                        <div>
                            <p> Lorem ipsum dolor, sit amet consectetur adipisicing elit. Sapiente minus possimus
                                perspiciatis
                                ad
                                commodi voluptatem. Quos tenetur non iusto illo, chavalillo!</p>
                        </div>
                        <div>
                            <img src="ima/png-clipart-flute-flute.png">
                            <a href="#"> Ver más </a>
                        </div>
                    </div>
                </article>


                <article>
                    <h3> Article 3: oboe</h3>

                    <div>
                        <div>
                            <p> Lorem ipsum dolor, sit amet consectetur adipisicing elit. Sapiente minus possimus
                                perspiciatis
                                ad
                                commodi voluptatem. Quos tenetur non iusto illo, obo-illo!</p>
                        </div>
                        <div>
                            <img src="ima/woodwind-instrument-oboe-2JxZ77F-600.jpg">
                            <a href="#"> Ver más </a>
                        </div>
                    </div>
                </article>

                <article>
                    <h3> Article 4: casiotone</h3>

                    <div>
                        <div>
                            <p> Lorem ipsum dolor, sit amet consectetur adipisicing elit. Sapiente minus possimus
                                perspiciatis
                                ad
                                commodi voluptatem. Quos tenetur non iusto illo, en el recre-illo!</p>
                        </div>
                        <div>
                            <img src="ima/casio-pt-80-76939.jpg">
                            <a href="#"> Ver más </a>
                        </div>
                    </div>
                </article>

            </section>

            <nav>
                <ol>
                    <li>Opción 1 <a href="#"></a></li>
                    <li>Opción 2 <a href="#"></a></li>
                    <li>Opción 3 <a href="#"></a></li>
                    <li>Opción 4 <a href="#"></a></li>
                    <li>Opción 5 <a href="#"></a></li>


                </ol>

            </nav>
        </div>

    </main>

    <footer>

        <a href="#"> <img src="ima/amazon-logo-editorial-icon-isolated-600nw-2333488123.webp"> </a>
        <a href="#"> <img src="ima/Vodafone-logo-vector-PNG.png"> </a>
        <a href="#"> <img src="ima/images flm.png"> </a>

    </footer>


</body>

</html>



*** Día 05/11/2025


05-NOV-2025

https://vallecas.com/
https://bukaneros.org/


*** Día 06/10/2025



<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="style.css">
</head>

<body>

    <header>

        <ol>
            <li><img src="ima/5431135sobre.png" style="width: 20px;"></li>
            <li><img src="ima/5431135sobre.png" style="width: 20px;"></li>
            <li><img src="ima/5431135sobre.png" style="width: 20px;"></li>
            <li><img src="ima/5431135sobre.png" style="width: 20px;"></li>
            <li><img src="ima/green-shopping-basket-filled-groceries-600nw-2603441651.webp" style="width: 20px;"></li>
        </ol>

        <ol>
            <li><a href="#">INICIO</a></li>
            <li><a href="#">NOTICIAS</a></li>
            <li><a href="#">¿QUIÉNES SOMOS?</a></li>
            <li><a href="#">HISTORIA</a></li>
            <li><a href="#">HOLOGRAMA</a></li>
            <li><a href="#">GALERÍAS</a></li>
            <li><a href="#">CONTACTO</a></li>
            <li><a href="#">TIENDA</a></li>
            <li><a href="#"><img src="ima/5431135sobre.png" style="width: 20px;"></a></li>
        </ol>

    </header>

    <main>


        <section id="partidos">
            <div>
                <div>
                    <article id="proxpartido">
                        <a href="#"><img src="ima/partidogen.jpg"></a>
                        <h2> ADRV - MCV</h2>
                        <p> Fecha</p>
                    </article>
                </div>
                <div id="restopartidos">
                    <article>
                        <a href="#"><img src="ima/partidogen.jpg"></a>
                        <h2> ADRV - MCV</h2>
                        <p> Fecha</p>
                    </article>
                    <article>
                        <a href="#"><img src="ima/partidogen.jpg"></a>
                        <h2> ADRV - MCV</h2>
                        <p> Fecha</p>
                    </article>
                    <article>
                        <a href="#"><img src="ima/partidogen.jpg"></a>
                        <h2> ADRV - MCV</h2>
                        <p> Fecha</p>
                    </article>
                    <article>
                        <a href="#"><img src="ima/partidogen.jpg"></a>
                        <h2> ADRV - MCV</h2>
                        <p> Fecha</p>
                    </article>
                    <article>
                        <a href="#"><img src="ima/partidogen.jpg"></a>
                        <h2> ADRV - MCV</h2>
                        <p> Fecha</p>
                    </article>
                    <article>
                        <a href="#"><img src="ima/partidogen.jpg"></a>
                        <h2> ADRV - MCV</h2>
                        <p> Fecha</p>
                    </article>



                </div>
            </div>
            <aside>

                <article>
                    <p> Texto publi Rayo </p>
                    <a href="#"><img src="ima/cabeceratienda.jpg"></a>

                </article>

                <article>
                    <p> Texto publi Rayo </p>
                    <a href="#"><img src="ima/cabeceratienda.jpg"></a>

                </article>

                <article>
                    <p> Texto publi Rayo </p>
                    <a href="#"><img src="ima/cabeceratienda.jpg"></a>

                </article>


            </aside>
        </section>

        <section id="youtube">

            <div>
                <h2> BUKANEROS EN YOUTUBE </h2>

            </div>
            <div>
                <article>

                    <a href="#"><img src="ima/fiestas-de-la-karmela-2025_00.webp"></a>
                    <a href="#">FIESTAS DE LA KARMELA 2025</a>
                </article>

                <article>

                    <a href="#"><img src="ima/fiestas-de-la-karmela-2025_00.webp"></a>
                    <a href="#">FIESTAS DE LA KARMELA 2025</a>
                </article>
                <article>

                    <a href="#"><img src="ima/fiestas-de-la-karmela-2025_00.webp"></a>
                    <a href="#">FIESTAS DE LA KARMELA 2025</a>
                </article>
                <article>

                    <a href="#"><img src="ima/fiestas-de-la-karmela-2025_00.webp"></a>
                    <a href="#">FIESTAS DE LA KARMELA 2025</a>
                </article>
                <article>

                    <a href="#"><img src="ima/fiestas-de-la-karmela-2025_00.webp"></a>
                    <a href="#">FIESTAS DE LA KARMELA 2025</a>
                </article>
                <article>

                    <a href="#"><img src="ima/fiestas-de-la-karmela-2025_00.webp"></a>
                    <a href="#">FIESTAS DE LA KARMELA 2025</a>
                </article>




            </div>
            <div>

                <a href="#"><img src="ima/fiestas-de-la-karmela-2025_00.webp"></a>

            </div>



        </section>

        <section id="galeria">

            <h3>Galería</h3>

            <ol>
                <li>

                    <a href="#"><img src="ima/2003-2004.jpg"></a>
                    <a href="#"> AÑO 2003-2004 </a>
                </li>

                <li>

                    <a href="#"><img src="ima/2003-2004.jpg"></a>
                    <a href="#"> AÑO 2003-2004 </a>
                </li>

                <li>

                    <a href="#"><img src="ima/2003-2004.jpg"></a>
                    <a href="#"> AÑO 2003-2004 </a>
                </li>

                <li>

                    <a href="#"><img src="ima/2003-2004.jpg"></a>
                    <a href="#"> AÑO 2003-2004 </a>
                </li>

            </ol>



        </section>



    </main>

    <footer>

        <div id="opciones">
            <p> ¿QUIÉNES SOMOS?</p>
            <P> CATEGORÍAS</p>
            <p> Bukaneros es un colectivo rayista formado allá por 1992, cuando el equipo de nuestro barrio se batía en
                las categorías nobles de nuestro fútbol. Todos estos años de historia se han basado en la lucha y
                defensa de nuestro equipo, nuestro barrio y nuestra forma de entenderlo siempre limpia de racismo y
                fascismo, valores tan alejados de nosotros como de lo que el Rayo Vallecano representa.</p>
            <ul>
                <li>Lorem, ipsum.</li>
                <li>Dolores, debitis!</li>
                <li>Neque, voluptatibus.</li>
                <li>Officiis, quibusdam.</li>
                <li>Esse, iusto.</li>
                <li>Aperiam, deleniti?</li>
                <li>Ea, pariatur.</li>
                <li>Vitae, eveniet?</li>
                <li>Quidem, quod.</li>
                <li>Quidem, maxime.</li>
                <li>Veritatis, totam!</li>
                <li>Dolore, corrupti!</li>
                <li>Harum, sequi.</li>
                <li>Ipsa, eaque!</li>
                <li>Enim, quibusdam.</li>
                <li>Atque, aliquid!</li>
                <li>Sunt, ipsum.</li>
                <li>Explicabo, corporis?</li>
                <li>Optio, animi!</li>
                <li>Porro, quae.</li>
                <li>Nobis, explicabo.</li>
                <li>Necessitatibus, doloribus.</li>
                <li>Impedit, possimus.</li>

            </ul>

        </div>

        <div id="final"> Bukaneros <strong>Rayo Vallecano</strong> </div>


    </footer>

</body>

</html>
















* {

    box-sizing: border-box;
    /* margin: 100px; */

}

header {

    background-image: url("ima/G41ZcuyWIAA6w0ucalavera.jpg");
    height: 100px;
    margin-bottom: 100px;

}

header>ol>li {

    display: inline-block;

}

header>ol:last-child>li {
    text-decoration: none;
    color: white;
    padding: auto;
}

header>ol:last-child>li:hover {
    background-color: red;
}


#partidos {

    display: grid;
    grid-template-columns: 2fr 1fr;
}

#proxpartido img {

    width: 600px;
}

#restopartidos {

    display: grid;
    grid-template-columns: 1fr 1fr;

}

#restopartidos img {

    width: 250px;

}



#galeria li {

    display: inline-block;

}

#galeria li img {

    width: 250px;
}

#opciones{

    display: grid;
    grid-template-columns: 1fr 2fr;
}

#opciones li{

    display: grid;
    grid-template-columns: 1fr 1fr 1fr;

}

#final{
color: gray;
background-color: black;
border-top: 1px solid white;

}


*** Día 07/11/2025

07-OCT-2025

18 y 19: no tenía sentido decir en el CSS que los li forman un grid, lo pongo como #opciones ul {} porque el verdadero grid es la lista, no las opciones de la lista


CSS A LAS 10:27, tras atacar al a para que al fin me aplique el text-decoration: none; y el color: white;


* {

    box-sizing: border-box;
    /* margin: 100px; */

}

header {

    background-image: url("ima/G41ZcuyWIAA6w0ucalavera.jpg");
    height: 250px;
    margin-bottom: 100px;

}

header>ol>li {

    display: inline-block;

}


header>ol:last-child {
    padding: auto;
    text-align: bottom;

}


header>ol:last-child>li>a {
    text-decoration: none;
    color: white;
    padding: auto;

}

header>ol:last-child>li:hover {
    background-color: red;
}


#partidos {

    display: grid;
    grid-template-columns: 2fr 1fr;
}

#proxpartido img {

    width: 600px;
}

#restopartidos {

    display: grid;
    grid-template-columns: 1fr 1fr;

}

#restopartidos img {

    width: 250px;

}


#youtube {

    background-color: grey;
    color: white;
    height: 800px;
}

#youtube>div {

    display: grid;
    grid-template-columns: 25% 75%;
}


#youtube>div h2 {

    text-align: center;

}

#youtube>div>div:first-child {

    display: grid;
    grid-template-columns: 1fr 1fr;
    text-decoration: none;

}

#youtube>div>div:first-child img {

    width: 100px;

}



#galeria li {

    display: inline-block;
    margin: auto;

}

#galeria li img {

    width: 250px;
}



#opciones {

    display: grid;
    grid-template-columns: 1fr 2fr;
    background-color: grey;
    color: white;
}

#opciones ul {

    display: grid;
    grid-template-columns: 1fr 1fr 1fr;
    list-style: none;

}

#final {
    color: gray;
    background-color: black;
    border-top: 1px solid white;

}




https://alejandro.avisando.com/examenes/1/

https://bukaneros.org/wp-content/themes/bukaneros/images/footer.png
https://bukaneros.org/wp-content/uploads/2025/08/CabeceraWEb-2.jpg


#opciones ul li{

border-bottom-width: 1px;
border-bottom-style: solid;
}

Esto me sirve para poner las líneas bajo los li... aunque ni tengo a's ni bottom's ahí




43, 44: FireShot para hacer un pantallazo de la página completa

Si un autónomo factura a una empresa lleva IRPF (si no he entendido mal)

101 se hace por JS
102: tras Compartir e Insertar saca la sentencia

112: ha cogido en Gimp el color con el cuentagotas: recoge el color, ve su hexadecimal y luego con él crea una variable

Cuantos menos id's y class's mejor

146, para forzar transparencias

153 y 154 para centrar la página

161, viendo el tamaño en Gimp

165 y 166 es probando las deformaciones de imagen

171: el cover rellena el espacio disponible, pero sin deformar la imagen. Lo que hace es no mostrar una parte de la imagen

216: los filtros no funcionan ni igual ni bien en todos los navegadores




239: hace eso a pesar de que una clase siempre es más específica que el árbol dom... y ya sale


MI CSS AL FINAL DEL DÍA:

* {

    box-sizing: border-box;
    /* margin: 100px; */

}

header {

    background-image: url("ima/G41ZcuyWIAA6w0ucalavera.jpg");
    height: 250px;
    margin-bottom: 100px;

}

header>ol>li {

    display: inline-block;

}


header>ol:last-child {
    padding: auto;
    text-align: bottom;

}


header>ol:last-child>li>a {
    text-decoration: none;
    color: white;
    padding: auto;

}

header>ol:last-child>li:hover {
    background-color: red;
}


#partidos {

    display: grid;
    grid-template-columns: 2fr 1fr;
}

#proxpartido img {

    width: 600px;
}

#restopartidos {

    display: grid;
    grid-template-columns: 1fr 1fr;

}

#restopartidos img {

    width: 250px;

}


#youtube {

    background-color: grey;
    color: white;
    height: 800px;
}

#youtube>div {

    display: grid;
    grid-template-columns: 25% 75%;
}


#youtube>div h2 {

    text-align: center;

}

#youtube>div>div:first-child {

    display: grid;
    grid-template-columns: 1fr 1fr;
    text-decoration: none;

}

#youtube>div>div:first-child img {

    width: 100px;

}



#galeria li {

    display: inline-block;
    margin: auto;

}

#galeria li img {

    width: 250px;
}



#opciones {

    display: grid;
    grid-template-columns: 1fr 2fr;
    background-color: grey;
    color: white;
}

#opciones ul {

    display: grid;
    grid-template-columns: 1fr 1fr 1fr;
    list-style: none;

}

#opciones ul li {

    border-bottom-width: 1px;
    border-bottom-style: solid;
}


#final {
    color: gray;
    background-color: black;
    border-top: 1px solid white;

}


*** Día 11/11/2025

Vimos object-fit: cover el viernes para el tratamiento de la imagen grande, para que se vea sin distorsión, sólo cortada

Completar el proyecto Examen

50: idealo.es, comparador de precios

A más herzios menos se te cansa el ojo




header ol:first-child {
    text-align: right;
}
Esto funciona aunque no lo redirijas a los li, mueve todos los li hacia la derecha (los tengo como display: inline-block;)


61:
header>ol:last-child {
    padding: 150px;
    text-align: center;

}
Baja el segundo ol, entiendo que porque el padding hace que lo separe del primero


En el aside le meto margin:auto; a img y a a, pero eso no tiene efecto para centrar los elementos, sin embargo un padding directamente en el aside sí los mueve


Añado los espacios verticales del aside con:

aside img {
    margin-top: 80px;
    margin-bottom: 80px;
}


Con el aside a no me lo cogía, y con padding-top contra el aside a tampoco, si no recuerdo mal


text-decoration: none; no me funciona en #youtube>div>div:first-child , sólo en #youtube>div>div:first-child>article>a:last-child {

SU CSS

* {
    box-sizing: border-box;
}

:root {
    --grisoscuro: #222222;
    --grisoscuro2: #262626;
    --grisoscurotrasparente: rgba(38, 38, 38, 0.911);
    --negro: #0f0f0f;
    --rojo: #d30d08;
    --rojotransparente: rgba(211, 11, 8, 0.452);
    --grisclaro: #ebebeb;
    --grisclaro2: #eeeeee;
    --grisclaro3: #d3d3d3;
    --grisclaro4: #707070;
    --blanco: #ffffff;
    --anchogeneral: 1140px
}

body {
    margin: 0px;
    padding: 0px;
    font-family: Arial, Helvetica, sans-serif;
}

img {
    max-width: 100%;
}

header {
    background-image: url("https://bukaneros.org/wp-content/uploads/2025/08/CabeceraWEb-2.jpg");
    height: 334px;
    width: var(--anchogeneral);
    margin: auto;
    margin-bottom: 110px;
    display: grid;
    grid-template-rows: auto auto;
    align-content: space-between;
}

header ul {
    list-style: none;
    margin: 0px;
    padding: 0px;
}

header ul li {
    display: inline-block;
}

header ul li a {
    color: var(--blanco);
    text-decoration: none;
}

header ul:first-child {
    text-align: right;
    padding: 25px;
    font-size: 2em;
}

header ul:last-child {
    font-size: 1.1em;
    text-align: center;
    background-color: var(--grisoscurotrasparente);
}

header ul:last-child li a {
    display: inline-block;
    padding: 25px;
}


header ul:last-child li a:hover {
    background-color: var(--rojotransparente);
}

main {
    display: grid;
    grid-template-rows: auto auto auto auto;
}

#mainprincipal {
    display: grid;
    grid-template-columns: 2fr 1fr;
    width: var(--anchogeneral);
    margin: auto;
    gap: 15px;
}

#mainprincipal>div>div:nth-child(2) {
    margin-top: 20px;
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 40px;
}

#mainprincipal>aside {
    background-color: var(--grisclaro);
    padding: 10px;
}

#mainprincipal>aside img {
    width: 100%;
    height: 260px;
    object-fit: cover;
    margin-bottom: 70px;
}

#mainprincipal img:hover {
    filter: opacity(82%);
}


#mainpaginador {}

#mainpaginador ul {
    padding: 0px;
    margin: 0px;
    list-style: none;
    text-align: center;
    margin: auto;
}

#mainpaginador ul li {
    display: inline-block
}

#mainpaginador ul li a {
    display: inline-block;
    background-color: var(--grisclaro);
    color: var(--grisclaro4);
    padding: 15px;
    border-radius: 3px;
    margin-left: 5px;
    text-decoration: none;
}

#mainpaginador a.seleccionado {
    background-color: var(--rojo);
    color: var(--blanco);

}

#mainyoutube {
    background-color: var(--grisoscuro);
    color: var(--blanco);
    margin-top: 80px;
}

#mainyoutube iframe {
    width: 100%;
}

#mainyoutube>div {
    width: var(--anchogeneral);
    margin: auto;
    display: grid;
    grid-template-columns: 1fr 2fr;
    padding-top: 30px;
    padding-bottom: 30px;
    gap: 30px;
}

#mainyoutube>div>div:first-child {
    margin-top: 100px;
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 35px;
    text-align: center;
    font-size: 0.8em;
}

#mainyoutube>div>div:first-child h3 {
    margin: 10px;
}

#mainyoutube>div>div:last-child {
    text-align: center;
}

#mainyoutube>div>div:last-child h2 {
    font-weight: 100;
    font-size: 2em;
}

#mainyoutube>div>div:last-child iframe {
    height: 400px;
}


#maingaleria {
    width: var(--anchogeneral);
    margin: auto;
    margin-top: 80px;
}

#maingaleria>div {
    display: grid;
    grid-template-columns: 1fr 1fr 1fr 1fr;
    gap: 20px;
}


#maingaleria>div img {
    width: 100%;
}

#maingaleria>div h3{
    background-color: var(--rojo);
    color: var(--blanco);
    text-align: center;
    padding: 15px;
    font-size: 1em;
}


footer{
    background-color: var(--grisoscuro2);
    color: var(--grisclaro3);
}

footer>div:first-child{
    width: var(--anchogeneral);
    margin: auto;
}

footer>div:first-child{
    padding-top: 50px;
    background-image: url("https://bukaneros.org/wp-content/themes/bukaneros/images/footer.png");
    background-repeat: no-repeat;
    display: grid;
    grid-template-columns: 1fr 3fr;
    gap: 100px;
    line-height: 32px;
}

footer>div:first-child>div:last-child>div{
    display: grid;
    grid-template-columns: 1fr 1fr 1fr;
}

footer>div:first-child>div:last-child>div ul{
    list-style: none;
    margin: 0px;
    padding: 0px;
}


footer>div:first-child>div:last-child>div ul li{
    border-bottom: 1px solid var(--grisclaro4);
}

footer>div:first-child>div:last-child>div ul li a{
    color: var(--grisclaro3);
    text-decoration: none;
    font-family: 'Times New Roman', Times, serif;
    text-transform: uppercase;
    font-size: 0.8em;
    padding-left: 10px;
}


footer>div:last-child{
    background-color: var(--negro);
    padding-top: 25px;
    padding-bottom: 25px;
    border-top: 1px solid var(--grisclaro4);
}
footer>div:last-child>p{
    display: block;
    width: var(--anchogeneral);
    margin: auto;
    color: var(--grisclaro4);
}

.tarjetaprincipal img {
    width: 100%;
    height: 420px;
    object-fit: cover;
}

.tarjetaprincipal h3 {
    font-size: 1.8em;
    margin: 10px;
    color: var(--negro);
    text-transform: uppercase;
}

.tarjetaprincipal p {
    color: var(--grisclaro3);
    margin: 0px;
    font-family: 'Times New Roman', Times, serif;
}



.tarjeta img {
    width: 100%;
    height: 200px;
    object-fit: cover;
}

.tarjeta h3 {
    font-size: 1.8em;
    margin: 10px;
    color: var(--negro);
    text-transform: uppercase;
}

.tarjeta p {
    color: var(--grisclaro3);
    margin: 0px;
    font-family: 'Times New Roman', Times, serif;
}

.tarjeta,
.tarjetaprincipal {
    margin-bottom: 60px;
}

.tarjeta h3:hover,
.tarjetaprincipal h3:hover {
    color: var(--rojo);
}

.negrita {
    font-weight: bold;
}


*** Día 12/11/2025

PHP

El ordenador es tonto e intermediario

El index pasa a ser .php

Metemos el progama/script dentro de <?php... ?>

javier.avisando.com/php/desayunos/index.php

ECHO te permite mostrar textos y resultados de operaciones
Las variables llevarán $ al final del nombre aunque sean numéricas: $a, $b, $a+$b...
echo "Hola Mundo" . ($a+$b);

6: es mejor cambiar el directorio que te da por defecto, por seguridad

22: tenemos una relación
25: hay id del pago e id de la persona

mysqli es la versión avanzada de mysql

52 tras poner un pegos como pagos

69: puedes definir por tipo, id...
72, 73: las esquinas se ven en sentido horario

timestamp te coge la hora de cuando se insertó el registro

PHP nos sirve para hacer dinámico el HTML

header input, header select no es igual a header input, select. En el segundo caso no se sobreentiende que sean sólo los select del header


La memoria RAM es volátil, pero más rápida, es de acceso rápido
Básicamente contiene los datos que necesitan las aplicaciones abiertas en ese momento para trabajar en tiempo real

Variables
Todas las variables son objetos
Es un espacio de memoria que puedo llamar por un nombre, que no puede empezar por número. No puede tener espacios ni caracteres especiales, diferencia entre mayúsculas y minúsculas

Ejemplos en PHP:
$numero=200;
$porcentaje=$numero*0.25;

Módulo: resto de una división entera (las que no son enteras no tienen módulo)

Echo "El resultado es".$porcentaje;

Ejercicio: dado un importe bruto, calcular el neto y el iva del 21%
$neto=$bruto/1.21;
$iva=$bruto-$neto;

176: view-source:https://es-kb.sage.com/portal/app/portlets/results/viewsolution.jsp?solutionid=251009162322523


*** Día 13/11/2025

Metemos el progama/script dentro de <?php... ?>

<?php
$bruto=400;
$neto=$bruto/1.21;
$iva=$bruto-$neto;
Echo "El resultado es".$neto;
Echo "El IVA es".$iva;
?>

Intentar que los nombres de las variables sean lo más explicativos posibles

9: las líneas 19 y 20 son dos formas de que salga lo mismo
Dentro de las llaves sólo pueden ir variables, en la otra podemos meter operaciones y resultados de funciones

SQL no tiene las estructuras ni el control que tiene un lenguaje de programación

number_format($bruto, 2)

Ejercicio de hoy: Dada una variable tabla=8 genere la tabla de multiplicar de ese número

https://desarrolloweb.com/articulos/314.php nos presenta este ejemplo:
<?php 
for ($size = 1; $size <= 6; $size++) echo"<span style=\"font-size: {$size}rem\">Tamaño {$size}rem</span><br>\n";
?>

(La página se titula "Estructuras de control de repetición en PHP. Explicaciones y ejemplos de los bucles while, do-while, for y foreach. Además veremos las sentencias de control de bucles break y continue")


https://www.php.net/manual/es/control-structures.for.php me aclara más sobre el FOR

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> Tabla de multiplicar </title>
</head>
<body>
    
<?php

$tabla=8;

for ($factor = 1; $factor <= 10; $factor++) {
 echo $tabla."*".$factor."=".$tabla*$factor;
 echo "<br>";
}
?>


</body>
</html>

Google con php for de 2 en 2 me muestra esto:

<?php
for ($i = 0; $i <= 10; $i += 2) {
    echo $i . "<br>";
}
?>

<?php
for ($i = 10; $i >= 0; $i -= 2) {
    echo $i . "<br>";
}
?>

... para ir del 0 al 10 y del 10 al 0, respectivamente

Y con esta información a lo anterior añado esto:

<br> <br>

<?php

$tabla=8;

for ($factor = 2; $factor <= 40; $factor+2) {
 echo $tabla."*".$factor."=".$tabla*$factor;
 echo "<br>";
}
?>

... pero le da por sacarme muhas veces 8*2=16 en lo que me parece una iteración infinita, así que evidentemente tengo que corregir algo... Siguiente paso (del segundo bloque):

<br> <br>

<?php

$tabla=8;

for ($factor = 2; $factor <= 40; $factor += 2) {
 echo $tabla."*".$factor."=".$tabla*$factor;
 echo "<br>";
}
?>

Resultado en 17:

8*1=8
8*2=16
8*3=24
8*4=32
8*5=40
8*6=48
8*7=56
8*8=64
8*9=72
8*10=80


8*2=16
8*4=32
8*6=48
8*8=64
8*10=80
8*12=96
8*14=112
8*16=128
8*18=144
8*20=160
8*22=176
8*24=192
8*26=208
8*28=224
8*30=240
8*32=256
8*34=272
8*36=288
8*38=304
8*40=320


<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> Tabla de multiplicar </title>
</head>
<body>
    
<?php

$tabla=8;

for ($factor = 1; $factor <= 10; $factor++) {
 echo $tabla."*".$factor."=".$tabla*$factor;
 echo "<br>";
}
?>

<br> <br>

<?php

$tabla=8;

for ($factor = 2; $factor <= 40; $factor += 2) {
 echo $tabla."*".$factor."=".$tabla*$factor;
 echo "<br>";
}
?>



</body>
</html>


Ejemplo sin bucles, como antiguamente:
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> Tabla de multiplicar </title>
</head>
<body>
    
<?php

$tabla=8;
$factor=1;

echo $tabla."*".$factor."=".$tabla*$factor;
echo "<br>";
$factor=$factor+1;
echo $tabla."*".$factor."=".$tabla*$factor;
echo "<br>";
$factor=$factor+1;
echo $tabla."*".$factor."=".$tabla*$factor;
echo "<br>";
$factor=$factor+1;
echo $tabla."*".$factor."=".$tabla*$factor;
echo "<br>";
$factor=$factor+1;
echo $tabla."*".$factor."=".$tabla*$factor;
echo "<br>";
$factor=$factor+1;
echo $tabla."*".$factor."=".$tabla*$factor;
echo "<br>";
$factor=$factor+1;
echo $tabla."*".$factor."=".$tabla*$factor;
echo "<br>";
$factor=$factor+1;
echo $tabla."*".$factor."=".$tabla*$factor;
echo "<br>";
$factor=$factor+1;
echo $tabla."*".$factor."=".$tabla*$factor;
echo "<br>";
$factor=$factor+1;
echo $tabla."*".$factor."=".$tabla*$factor;
?>
<br><br><br>
<a href="indexav.php"> Ve al avanzado </a>

</body>
</html>


... pero no me preguntes por qué el href no me funciona, aunque aparentemnte está bien dirigido


Ejercicio: Calcular el IMC teniendo altura y peso
37: por no tener el index con extensión PHP. En ficheros con extensión HTML no entiende el <?php
Lo cambias y ya perfecto el <?php introducido antes

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>IMC</title>
</head>
<body>
    
<?php
$altura=1.78;
$peso=80;
echo "Midiendo {$altura} y con un peso de {$peso} tienes un IMC de ". $peso/($altura*$altura)."<br>";
echo "Midiendo {$altura} y con un peso de {$peso} tienes un IMC incorrecto de ". $peso/$altura*$altura
?>



</body>
</html>

Tiene gracia que me acepta el último echo sin el punto y coma...

Ejercicio: Variable n con número entero positivo, queremos la suma de los enteros secuenciales desde 1 hasta n


<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Suma secuencial</title>
</head>

<body>

    <?php
    $numero = 8;
    $semueve = 1;
    $suma = 0;

    $suma = $suma + $semueve;
    echo "Paso número {$semueve}. Hasta aquí la suma total es {$suma}. <br>";
    $semueve = $semueve + 1;

    $suma = $suma + $semueve;
    echo "Paso número {$semueve}. Hasta aquí la suma total es {$suma}. <br>";
    $semueve = $semueve + 1;

    $suma = $suma + $semueve;
    echo "Paso número {$semueve}. Hasta aquí la suma total es {$suma}. <br>";
    $semueve = $semueve + 1;

    $suma = $suma + $semueve;
    echo "Paso número {$semueve}. Hasta aquí la suma total es {$suma}. <br>";
    $semueve = $semueve + 1;

    $suma = $suma + $semueve;
    echo "Paso número {$semueve}. Hasta aquí la suma total es {$suma}. <br>";
    $semueve = $semueve + 1;

    $suma = $suma + $semueve;
    echo "Paso número {$semueve}. Hasta aquí la suma total es {$suma}. <br>";
    $semueve = $semueve + 1;

    $suma = $suma + $semueve;
    echo "Paso número {$semueve}. Hasta aquí la suma total es {$suma}. <br>";
    $semueve = $semueve + 1;

    $suma = $suma + $semueve;
    echo "Paso número {$semueve}. Hasta aquí la suma total es {$suma}. <br>";
    $semueve = $semueve + 1;


    ?>

    <br>
    <p> Ni la menor idea de cómo hacer esto por ejemplo para 8257 </p>

</body>

</html>

Pero resulta que Google para "demostración de fórmula de suma secuencial de enteros" nos dice que:
La fórmula de la suma de enteros consecutivos se puede demostrar sumando la secuencia en orden normal y en orden inverso. La demostración de Gauss, que es la más común, consiste en escribir la suma de la secuencia \(S=1+2+3+...+n\) y luego escribirla en orden inverso, \(S=n+(n-1)+(n-2)+...+1\). Al sumar ambas expresiones, se obtiene \(2S=(n+1)+(n+1)+...+(n+1)\) donde \((n+1)\) aparece \(n\) veces, lo que da \(2S=n(n+1)\). Al dividir ambos lados por 2, se llega a la fórmula \(S=\frac{n(n+1)}{2}\)

Así que llegaríamos a que:

$suma = $numero*($numero+1)/2;

... sin necesidad de añadir tanta línea de código. OK.



https://arturo.avisando.com/php/sumas/a%20b.php es como me muestra en la barra de direcciones de Google el fichero a b.php


echo ++$contador suma 1 antes de utilizar la variable, $contador++ lo suma después
También existen --$contador, $contador+=25 (sumaría 25)... incluso con %$contador

62 es la misma tabla expresada de otra manera
63 lleva a 64, es para mostrar que cuando hay operaciones no se pueden aplicar llaves en el echo


*** Día 14/11/2025

Formulario para que nos deje elegir el número de la tabla de multiplicar


Carne de cerdo, cordero, ternera, pollo, fiambre... que nos deje elegir monto vendido y un color con formularios, y que con eso generar un gráfico de barras con porcentajes. Usando sólo lo que ya sabemos, con grid por ejemplo.
No usar más de lo que ya nos ha enseñado
… ¿grid áreas?, se me ocurre

Empiezo por la tabla de multiplicar, por ejemplo

MI PREVIO es el siguiente:

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> Tabla de multiplicar </title>
</head>
<body>
    
<?php

$tabla=8;
$factor=1;

echo $tabla."*".$factor."=".$tabla*$factor;
echo "<br>";
$factor=$factor+1;
echo $tabla."*".$factor."=".$tabla*$factor;
echo "<br>";
$factor=$factor+1;
echo $tabla."*".$factor."=".$tabla*$factor;
echo "<br>";
$factor=$factor+1;
echo $tabla."*".$factor."=".$tabla*$factor;
echo "<br>";
$factor=$factor+1;
echo $tabla."*".$factor."=".$tabla*$factor;
echo "<br>";
$factor=$factor+1;
echo $tabla."*".$factor."=".$tabla*$factor;
echo "<br>";
$factor=$factor+1;
echo $tabla."*".$factor."=".$tabla*$factor;
echo "<br>";
$factor=$factor+1;
echo $tabla."*".$factor."=".$tabla*$factor;
echo "<br>";
$factor=$factor+1;
echo $tabla."*".$factor."=".$tabla*$factor;
echo "<br>";
$factor=$factor+1;
echo $tabla."*".$factor."=".$tabla*$factor;
?>
<br><br><br>
<a href="indexav.php"> Ve al avanzado </a>

</body>
</html>


El día 20 encuentro esto:
<form action="guardar.php" method="post"> </form>
<label for "nombre"> Su nombre </label>, para poner un título frente a la casilla
input type="submit" value="Enviar" para formar un botón de envío

Llego a este estado, pero aunque me pregunta la información no me pinta la tabla:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> Tabla de multiplicar </title>
</head>

<body>


<br><br>
<form action="index.php" method="post">
<label for "numero"> Tabla de multiplicar del... </label>
<input type="number" name="numero" min=1 max=100 step=1 required>
<input type="submit" value="Enviar">
</form>


    <?php

    $tabla = $_POST("numero");
    $factor = 1;

    echo $tabla . "*" . $factor . "=" . $tabla * $factor;
    echo "<br>";
    $factor = $factor + 1;
    echo $tabla . "*" . $factor . "=" . $tabla * $factor;
    echo "<br>";
    $factor = $factor + 1;
    echo $tabla . "*" . $factor . "=" . $tabla * $factor;
    echo "<br>";
    $factor = $factor + 1;
    echo $tabla . "*" . $factor . "=" . $tabla * $factor;
    echo "<br>";
    $factor = $factor + 1;
    echo $tabla . "*" . $factor . "=" . $tabla * $factor;
    echo "<br>";
    $factor = $factor + 1;
    echo $tabla . "*" . $factor . "=" . $tabla * $factor;
    echo "<br>";
    $factor = $factor + 1;
    echo $tabla . "*" . $factor . "=" . $tabla * $factor;
    echo "<br>";
    $factor = $factor + 1;
    echo $tabla . "*" . $factor . "=" . $tabla * $factor;
    echo "<br>";
    $factor = $factor + 1;
    echo $tabla . "*" . $factor . "=" . $tabla * $factor;
    echo "<br>";
    $factor = $factor + 1;
    echo $tabla . "*" . $factor . "=" . $tabla * $factor;
    ?>
    <br><br><br>
    <a href="indexav.php"> Ve al avanzado </a>

</body>

</html>

Aunque VSCode no me mostraba errores el programa funciona de esta forma:
(El cambio es pasar de paréntesis a corchetes en     $tabla = $_POST["numero"];)

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> Tabla de multiplicar </title>
</head>

<body>


<br><br>
<form action="index.php" method="post">
<label for "numero"> Tabla de multiplicar del... </label>
<input type="number" name="numero" min=1 max=100 step=1 required>
<input type="submit" value="Enviar">
</form>


    <?php

    $tabla = $_POST["numero"];
    $factor = 1;

    echo $tabla . "*" . $factor . "=" . $tabla * $factor;
    echo "<br>";
    $factor = $factor + 1;
    echo $tabla . "*" . $factor . "=" . $tabla * $factor;
    echo "<br>";
    $factor = $factor + 1;
    echo $tabla . "*" . $factor . "=" . $tabla * $factor;
    echo "<br>";
    $factor = $factor + 1;
    echo $tabla . "*" . $factor . "=" . $tabla * $factor;
    echo "<br>";
    $factor = $factor + 1;
    echo $tabla . "*" . $factor . "=" . $tabla * $factor;
    echo "<br>";
    $factor = $factor + 1;
    echo $tabla . "*" . $factor . "=" . $tabla * $factor;
    echo "<br>";
    $factor = $factor + 1;
    echo $tabla . "*" . $factor . "=" . $tabla * $factor;
    echo "<br>";
    $factor = $factor + 1;
    echo $tabla . "*" . $factor . "=" . $tabla * $factor;
    echo "<br>";
    $factor = $factor + 1;
    echo $tabla . "*" . $factor . "=" . $tabla * $factor;
    echo "<br>";
    $factor = $factor + 1;
    echo $tabla . "*" . $factor . "=" . $tabla * $factor;
    ?>
    <br><br><br>
    <a href="indexav.php"> Ve al avanzado </a>

</body>

</html>

https://arturo.avisando.com/php/tabla/index.php


Paso al segundo ejercicio:
54: cuidado con comentar bloques que ya tenían comentarios... no queda bien
56, 57: en el caos, generando el caos con los comentarios
58: ¿no me deja comentar la etiqueta <?php???... Se ve que era eso (59)

62, estado previo al CSS:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Ventas de carne</title>
</head>

<body>


    <h1> Selección de carnes y colores </h1>

    <form action="index.php" method="post">
        <fieldset>

            <legend> Datos </legend>

            <section>
                <div>
                    <h3> Carnes </h3>

                    <select id="Carne1" name="Carne1" required>
                        <option value="">-- Selecciona --</option>
                        <option value="cerdo">Cerdo</option>
                        <option value="cordero">Cordero</option>
                        <option value="ternera">Ternera</option>
                        <option value="pollo">Pollo</option>
                        <option value="fiambres">Fiambres</option>
                    </select>

                    <select id="Carne2" name="Carne2" required>
                        <option value="">-- Selecciona --</option>
                        <option value="cerdo">Cerdo</option>
                        <option value="cordero">Cordero</option>
                        <option value="ternera">Ternera</option>
                        <option value="pollo">Pollo</option>
                        <option value="fiambres">Fiambres</option>
                    </select>

                    <select id="Carne3" name="Carne3" required>
                        <option value="">-- Selecciona --</option>
                        <option value="cerdo">Cerdo</option>
                        <option value="cordero">Cordero</option>
                        <option value="ternera">Ternera</option>
                        <option value="pollo">Pollo</option>
                        <option value="fiambres">Fiambres</option>
                    </select>

                    <select id="Carne4" name="Carne4" required>
                        <option value="">-- Selecciona --</option>
                        <option value="cerdo">Cerdo</option>
                        <option value="cordero">Cordero</option>
                        <option value="ternera">Ternera</option>
                        <option value="pollo">Pollo</option>
                        <option value="fiambres">Fiambres</option>
                    </select>

                    <select id="Carne5" name="Carne5" required>
                        <option value="">-- Selecciona --</option>
                        <option value="cerdo">Cerdo</option>
                        <option value="cordero">Cordero</option>
                        <option value="ternera">Ternera</option>
                        <option value="pollo">Pollo</option>
                        <option value="fiambres">Fiambres</option>
                    </select>
                </div>

                <div>
                    <h3> Importe de ventas </h3>

                    <input type="number" name="ventas1" step=1 required>
                    <input type="number" name="ventas2" step=1 required>
                    <input type="number" name="ventas3" step=1 required>
                    <input type="number" name="ventas4" step=1 required>
                    <input type="number" name="ventas5" step=1 required>

                </div>

                <div>
                    <h3> Color en la gráfica </h3>

                    <input type="color" name="color1" required>
                    <input type="color" name="color2" required>
                    <input type="color" name="color3" required>
                    <input type="color" name="color4" required>
                    <input type="color" name="color5" required>


                </div>
            </section>
            <input type="submit" value="Enviar">

        </fieldset>



    </form>

    <!-- 
    Y ya en PHP...

    $tabla = $_POST("numero"); -->




</body>

</html>


CSS en 67:


section div{
display: grid;
grid-template-columns: 3fr 3fr 1f;
}

body input{
text-align: center;
}



111: el php en estos momentos:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Ventas de carne</title>
    <link rel="stylesheet" href="style.css">
</head>

<body>


    <h1> Selección de carnes y colores </h1>

    <form action="index.php" method="post">
        <fieldset>

            <legend> Datos </legend>

            <section id="datos">
                <div>
                    <h3> Carnes </h3>

                    <select id="Carne1" name="Carne1" required>
                        <option value="">-- Selecciona --</option>
                        <option value="cerdo">Cerdo</option>
                        <option value="cordero">Cordero</option>
                        <option value="ternera">Ternera</option>
                        <option value="pollo">Pollo</option>
                        
                    </select>

                    <select id="Carne2" name="Carne2" required>
                        <option value="">-- Selecciona --</option>
                        <option value="cerdo">Cerdo</option>
                        <option value="cordero">Cordero</option>
                        <option value="ternera">Ternera</option>
                        <option value="pollo">Pollo</option>
                        
                    </select>

                    <select id="Carne3" name="Carne3" required>
                        <option value="">-- Selecciona --</option>
                        <option value="cerdo">Cerdo</option>
                        <option value="cordero">Cordero</option>
                        <option value="ternera">Ternera</option>
                        <option value="pollo">Pollo</option>
                        
                    </select>

                    <select id="Carne4" name="Carne4" required>
                        <option value="">-- Selecciona --</option>
                        <option value="cerdo">Cerdo</option>
                        <option value="cordero">Cordero</option>
                        <option value="ternera">Ternera</option>
                        <option value="pollo">Pollo</option>
                        
                    </select>

                </div>

                <div>
                    <h3> Importe de ventas </h3>

                    <input type="number" name="ventas1" step=1 required>
                    <input type="number" name="ventas2" step=1 required>
                    <input type="number" name="ventas3" step=1 required>
                    <input type="number" name="ventas4" step=1 required>

                </div>

                <div>
                    <h3> Color en la gráfica </h3>

                    <input type="color" name="color1" required>
                    <input type="color" name="color2" required>
                    <input type="color" name="color3" required>
                    <input type="color" name="color4" required>


                </div>
            </section>
            <input type="submit" value="Enviar">

        </fieldset>

    </form>

<?php

$total=$_POST["ventas1"]+$_POST["ventas2"]+$_POST["ventas3"]+$_POST["ventas4"];
$porcentaje1=$_POST["ventas1"]/$total;
$porcentaje2=$_POST["ventas2"]/$total;
$porcentaje3=$_POST["ventas3"]/$total;
$porcentaje4=$_POST["ventas4"]/$total;
?>

<section id="grafica">

<?php
echo $_POST["Carne1"]."   ".$_POST["ventas1"];
echo $_POST["Carne2"]."   ".$_POST["ventas2"];
echo $_POST["Carne3"]."   ".$_POST["ventas3"];
echo $_POST["Carne4"]."   ".$_POST["ventas4"];

?>


</section>










</body>

</html>


Y como en el CSS no me deja usar $porcentaje1 o S_POST["color1"], según parece, meto las variables en el root
Así al menos no me da error... pero no me salen las barras, sólo los textos (112). Por lo menos aquí sí me respeta el grid


root {
--porcentaje1: $porcentaje1;
--porcentaje2: $porcentaje2;
--porcentaje3: $porcentaje3;
--porcentaje4: $porcentaje4;
--color1: S_POST["color1"];
--color2: S_POST["color2"];
--color3: S_POST["color3"];
--color4: S_POST["color4"];
}


#datos{
display: grid;
grid-template-columns: 3fr 3fr 1f;
}

#datos input{
justify-items: center;
}

#grafica{
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr;
}



#grafica php>echo:nth-child(1){
height: var(--porcentaje1)*100px;
background-color: var(--color1);

}

#grafica php>echo:nth-child(2){
height: var(--porcentaje2)*100px;
background-color: var(--color2);
}

#grafica php>echo:nth-child(3){
height: var(--porcentaje3)*100px;
background-color: var(--color3);
}

#grafica php>echo:nth-child(4){
height: var(--porcentaje4)*100px;
background-color: var(--color4);
}


https://arturo.avisando.com/php/carnes/index.php

https://alejandro.avisando.com/php/grafica/index.php


*** Día 17/11/2025

¿Esto se puede hacer? Es decir, usar las variables del lado PHP en el CSS. No me da error en el visual code, pero no me sale lo que tenía que salir
root {
--porcentaje1: $porcentaje1;
--porcentaje2: $porcentaje2;
--porcentaje3: $porcentaje3;
--porcentaje4: $porcentaje4;
--color1: S_POST["color1"];
--color2: S_POST["color2"];
--color3: S_POST["color3"];
--color4: S_POST["color4"];
}


Aula 326 9:27
si la extensión en php se puede perfectamente


Por 30 me falta antes de 31 cómo activaba los warnings y errores de en este caso Marcos

cssgenerator hoy, la semana pasada otras webs de estas interesantes como el fontawesome
Eso fue buscando css generator en Google

45 lo ha hecho con un echo

ANOTAR AUSENCIA

https://javier.avisando.com/php/get/index.php?numero=15
https://javier.avisando.com/php/get/index.php?numero=18

https://arturo.avisando.com/php/tabla/index.php
https://arturo.avisando.com/php/tabla/get/index.php?numero=15
https://arturo.avisando.com/php/tabla/index.php?numero=15
… y no me funciona


Busco en Google "ejecutar php desde el navegador con get" y me sale esto:


Para ejecutar un archivo PHP desde el navegador usando parámetros GET, necesitas tener un servidor web con PHP (por ejemplo, Apache con XAMPP, WAMP, MAMP o un servidor remoto con PHP habilitado).

Aquí tienes un ejemplo completo y funcional:

1️⃣ Código PHP (saludo.php)
Php

Copiar código
<?php
// Validar si el parámetro 'nombre' existe en la URL
if (isset($_GET['nombre']) && !empty(trim($_GET['nombre']))) {
    // Sanitizar la entrada para evitar inyecciones XSS
    $nombre = htmlspecialchars($_GET['nombre'], ENT_QUOTES, 'UTF-8');
    echo "Hola, $nombre. ¡Bienvenido!";
} else {
    echo "Por favor, proporciona un nombre en la URL usando ?nombre=TuNombre";
}
?>
2️⃣ Cómo ejecutarlo en el navegador
Guarda el archivo como saludo.php en la carpeta de tu servidor web:
En XAMPP: C:\xampp\htdocs\saludo.php
En MAMP: /Applications/MAMP/htdocs/saludo.php
En Linux con Apache: /var/www/html/saludo.php
Inicia el servidor Apache desde tu panel de control (XAMPP, MAMP, etc.).
Abre tu navegador y escribe en la barra de direcciones:

Copiar código
http://localhost/saludo.php?nombre=Juan
3️⃣ Explicación
$_GET['nombre'] obtiene el valor pasado en la URL después de ?nombre=.
htmlspecialchars() evita que se ejecute código malicioso si el usuario introduce HTML o JavaScript.
Si no se pasa el parámetro, se muestra un mensaje indicando cómo usarlo.
✅ Ejemplo de ejecución:

URL: http://localhost/saludo.php?nombre=Ana
Salida: Hola, Ana. ¡Bienvenido!
Si quieres, puedo prepararte un ejemplo más avanzado que reciba múltiples parámetros GET y los procese en PHP.
¿Quieres que te lo haga?


En el código fuente de su tabla de multiplicar https://javier.avisando.com/php/get/index.php?numero=18 veo:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>La Tabla de Multiplicar</title>
    <link rel="stylesheet" href="style.css">
</head>

<body>

    <form action="index.php" method="get">
        <input type="number" name="numero" required min="1" placeholder="Su Número...">
        <input type="hidden" name="pag" value="0">
        <input type="submit" value="Crear Tabla">
    </form>


        <table class="blueTable">
        <caption>La Tabla del 18</caption>
        <tr><td>18</td><td>X</td><td>1</td><td>=</td><td>18</td></tr><tr><td>18</td><td>X</td><td>2</td><td>=</td><td>36</td></tr><tr><td>18</td><td>X</td><td>3</td><td>=</td><td>54</td></tr><tr><td>18</td><td>X</td><td>4</td><td>=</td><td>72</td></tr><tr><td>18</td><td>X</td><td>5</td><td>=</td><td>90</td></tr><tr><td>18</td><td>X</td><td>6</td><td>=</td><td>108</td></tr><tr><td>18</td><td>X</td><td>7</td><td>=</td><td>126</td></tr><tr><td>18</td><td>X</td><td>8</td><td>=</td><td>144</td></tr><tr><td>18</td><td>X</td><td>9</td><td>=</td><td>162</td></tr><tr><td>18</td><td>X</td><td>10</td><td>=</td><td>180</td></tr>    </table>

    <a href="index.php?numero=17">Anterior</a>
    <a href="index.php?numero=19">Siguiente</a>

</body>

</html>



EJERCICIO: álbum de fotos de antes pero en un único fichero PHP, utilizando el método GET


*** Día 18/11/2025

Ejercicio:
Hacer una web del album. En la columna izquierda seleccionar el album X y en cada foto poder ir adelante o atrás

Nos aconseja actualizar el SO una vez a la semana

75 es interesante para ver las expresiones, como 83
REV, TOMAR INSTRUCCIONES

87: diferentes protocolos para una web

<?php
echo "hola mundo";
?>


https://www.php.net/manual/es/function.pow.php

pow
(PHP 4, PHP 5, PHP 7, PHP 8)

pow — Expresión exponencial

Descripción ¶
pow(mixed $num, mixed $exponent): int|float|object
Devuelve num elevado a la potencia exponent.

Nota:

Es posible utilizar el operador ** en su lugar.

Módulo: $resto=$dividendo % $divisor;
Ejemplo: $n%2;


(1+i/100)^n=(100/100+i/100)^n=(100+i/100)^n=(100+i)^n/100^n

ESTRUCTURAS DE CONTROL
IF es una estructura de control básica decisiva


*** Día 19/11/2025

Este es el código del martes, de ayer:

    <main>
        <?php
        $album = $_GET['album'];
        $foto = $_GET['foto'];
        ?>
        <img src="albunes/<?php echo $album; ?>/<?php echo $foto; ?>.jpg" alt="">
        <nav>
            <ul>
                <li><a href="index.php?album=<?php echo $album; ?>&foto=<?php echo $foto - 1; ?>"><i class="fa-solid fa-angle-left"></i> Anterior</a></li>
                <li><a href="index.php?album=<?php echo $album; ?>&foto=<?php echo $foto + 1; ?>">Siguiente <i class="fa-solid fa-angle-right"></i></a></li>
            </ul>
        </nav>
    </main>


Es decir:

Formato de recogida: $album = $_GET['album'];
Indicación de ruta para colocar imagen: <img src="albunes/<?php echo $album; ?>/<?php echo $foto; ?>.jpg" alt="">
Indicación de ruta para ir activando el método GET:
<a href="index.php?album=<?php echo $album; ?>&foto=<?php echo $foto - 1; ?>">


En su web... para adaptar, pero aquí hay más cosas que las mías
Areas | Descargar
Bukaneros | Descargar
PHP ^
Los Desayunos Bukaneros | Descargar
IVA | Descargar
IMC | Descargar
SUMAS | Descargar
TABLA DE MULTIPLICAR | Descargar
Gráficos de ventas carnicería | Descargar
Album de foto | Descargar


10 es sin estilos ni fa's
11 viene por 12: el archivo no se llama index, aquí se llama album
13 imagino que es por 14... upload folder
15 es por 16, la extensión de la foto 1 no es jpg

19 y 20:
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.0.1/css/all.min.css" integrity="sha512-2SwdPD6INVrV/lHTZbO2nodKhrnDdJK9/kg2XD1r9uGqPo1cUbujc+IYdlYdEErWNu69gVcYgdxlmVmzTWnetw==" crossorigin="anonymous" referrerpolicy="no-referrer" />
Buscando "font awesome cdnjs.cloudflare.com/ajax" llego a https://cdnjs.com/libraries/font-awesome

Esto tiene 3 opciones:
Copy URL:
https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.0.1/css/all.min.css

Copy Link Tag (lo que me interesaba):
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.0.1/css/all.min.css" integrity="sha512-2SwdPD6INVrV/lHTZbO2nodKhrnDdJK9/kg2XD1r9uGqPo1cUbujc+IYdlYdEErWNu69gVcYgdxlmVmzTWnetw==" crossorigin="anonymous" referrerpolicy="no-referrer" />

Copy SRI Hash:
sha512-2SwdPD6INVrV/lHTZbO2nodKhrnDdJK9/kg2XD1r9uGqPo1cUbujc+IYdlYdEErWNu69gVcYgdxlmVmzTWnetw==



ESTRUCTURAS DE CONTROL
Comenzamos con el manual oficial de PHP:
https://www.php.net/manual/es/control-structures.elseif.php
https://www.php.net/manual/es/control-structures.if.php

<?php
if ($a > $b) {
    echo "a es más grande que b";
} elseif ($a == $b) {
    echo "a es igual a b";
} else {
    echo "a es más pequeño que b";
}
?>



<?php
if ($a > $b)
  echo "a es más grande que b";
?>


<?php
if ($a > $b) {
  echo "a es más grande que b";
  $b = $a;
}
?>


https://www.php.net/manual/es/language.operators.comparison.php
$a = $b no es comparar, es asignar. Asignar es $a == $b
$a == $b
Son iguales aunque uno sea "8" y otro 8, pero no en el caso de $a === $b


https://www.php.net/manual/es/language.operators.logical.php
if (($color!="blanco") && ($edad>=18) {

}
... en este ejemplo no se cumple el if si $edad=15;
Si cambiamos a || (OR) se cumple el if, daría resultado true


La expresión if (!($color=="blanco")) necesita los dos paréntesis. Es decir, si las dos expresiones no son iguales, si el color no es blanco


https://www.php.net/manual/es/control-structures.elseif.php
elseif, como su nombre indica, es una combinación de if y de else. Como la expresión else, permite ejecutar una instrucción después de un if en el caso de que el "primer" if sea evaluado como false. Sin embargo, a diferencia de la expresión else, solo ejecutará la instrucción si la expresión condicional elseif es evaluada como true.


isset($var) es verdadero si la variable existe
https://www.php.net/manual/es/function.isset.php
isset — Determina si una variable está declarada y es diferente de null

*** Casos en php/if

https://www.php.net/manual/es/function.file-exists.php
file_exists — Verifica si un fichero o un directorio existe

if (file-exists("albumes/{$album}/".$foto-1.".jpg"))...

https://www.php.net/manual/es/function.is-numeric.php
is_numeric — Determina si una variable es un número o una cadena numérica
if (is_numeric($element)) {}


EJERCICIO: Preguntar por entero mayor que cero, verifique que es así y que nos diga si es par o impar
En php/if/par


*** Día 20/11/2025

Y llego al código final por el ==:
(con = me decía en todos impar)

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Busco par</title>
</head>

<body>


    <!-- EJERCICIO: Preguntar por entero mayor que cero, verifique que es así y que nos diga si es par o impar -->

    <form action="index.php" method="post">

        <input type="number" name="numero" min=1 step=1>

    </form>

    <?php

    $numero = $_POST['numero'];
    $resto = $numero % 2;

    if (is_numeric($numero)) {
        if ($resto == "0") {
            echo "El número " . $numero . " es par";
        } else {

            echo "El número " . $numero . " es impar";
        }
    }
else {
    echo "Debes usar un número entero mayor que cero";
}

    ?>
</body>

</html>


WORDPRESS:
Hecho principalmente en PHP
Usa MariaDB o SQL
Gratuito, aunque tiene plugins de pago
También tiene temas (estilos CSS y otros cambios)

Cuanto más corto sea el dominio mejor
Hay que pensar cómo te encuentra la gente, cómo te van a buscar

Adword de Google ayuda a localizar buenos nombres de dominio... pero es de pago
ROI: retorno operativo de la inversión

31: como tiene la privacidad activada lo de 32 no muestra los datos de 31

Interdominios también proporciona DNS's, hace falta un servidor DNS para lanzar el dominio, como si fuera un conmutador

Cloud: ordenador alquilado de dimensión variable, para hacer lo que quieras. Tiene la refrigeración adecuada, resueltos los temas de redundancia (tiene capas de redundancia configuradas), cortafuegos... pero es sólo hardware que tienes que configurar tú 
Hosting: tiene VP's (máquinas virtuales) y compartidos (como lo que tenemos nosotros), dentro de un "equipo" que ya tiene el SO y las condiciones impuestas y fijas

Contratar en España, que la IP sea española

Como nombre de host usar un subdominio, no el dominio como tal

47: activar backups (espejos) si hacemos algo real. Activaremos más o menos en función del volumen de información que manejemos

Llave SSH: fichero que nos sirve como contraseña (algo físico vs a la contraseña que no lo es)

50: todo eso es en cloud, en hosting te lo dan hecho e inmutable

postfix y dovecot, servidores de correo para enviar y recibir, aunque hay muchos para elegir

Ataques DDos son ataques por fuerza bruta

Balanceo de carga: un equipo reparte las peticiones al equipo menos sobrecargado de un grupo

69: tras @ poner eso o la IP
73: desde su equipo está operando sobre el "nuevo"
76: con esa instrucción instalamos todo... sin el sudo, que somos administradores

12:45
:10000 porque para acceder al virtualmin hay que entrar por el puerto 10000. Si se cierra ese puerto esto no funciona

Postfix está en el puerto 25 por ser para envío de correo

Crea servidor virtual en virtualmin
En Administrar aplicaciones web están Wordpress, phpMyAdmin...

127: cada plugin tiene opciones diferentes

137 es para convertir la página en una tienda

201 para crear categorías

Cuantos más plugins uses más memoria gastará el cargar la web

Hasta 217 tramitamos un cambio de tema


*** Día 24/11/2025

Volvemos al ejercicio de los números pares e impares

50: luego vemos la carga útil y hacemos una copia de la cURL para verlo en modo consola, porque el input está limitado a número, pero si se hace desde consola se pueden meter valores no numéricos

Ejercicio: de un número de 3 cifras entero positivo que nos diga cuál es el dígito mayor

Ejercicio: IMC mejorado, que dados peso y estatura nos diga el IMC, el tipo de peso y nos saque una imagen indicativa



Buscando en Google "php coger parte entera":

Para obtener la parte entera de un número en PHP, puedes usar la función intval() o floor(), dependiendo de tus necesidades. Aquí tienes ejemplos:

1. Usando intval()
Php

Copiar código
$numero = 12.34;
$parte_entera = intval($numero); // Resultado: 12
echo $parte_entera;
intval() convierte el número a un entero, eliminando la parte decimal.

2. Usando floor()
Php

Copiar código
$numero = 12.34;
$parte_entera = floor($numero); // Resultado: 12
echo $parte_entera;
floor() redondea hacia abajo al entero más cercano, útil si el número puede ser negativo.

3. Usando round() (opcional)
Si necesitas redondear al entero más cercano:

Php

Copiar código
$numero = 12.34;
$parte_entera = round($numero); // Resultado: 12
echo $parte_entera;
Elige la función que mejor se adapte a tu caso. ¡Espero que te sea útil!


74: al abrir el archivo de nuevo mantenía la selección anterior de lo que había copiado
(En 73 lo había vuelto a seleccionar para confirmarlo)


PROGRAMAS SIN PROBAR:

EJERCICIO 1:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Dígito mayor</title>
</head>

<body>

    <!-- Ejercicio: de un número de 3 cifras entero positivo que nos diga cuál es el dígito mayor -->

    <form action="index.php" method="post">

        <input type="number" name="numero" min=100 max=999 step=1>

    </form>

    <?php

    $numero = $_POST['numero'];
    $digito3 = $numero / 100;
    $digito1 = intval($digito3);
    $digito3 = ($digito3 - $digito1) * 10;
    $digito2 = intval($digito3);
    $digito3 = ($digito3 - $digito2) * 10;

    if (($digito1 >= $digito2) && ($digito1 >= $digito3)) {
        $mayor = $digito1;
    } else if ($digito2 >= $digito3) {
        $mayor = $digito2;
    } else {
        $mayor = $digito3;
    }

    echo "El mayor dígito de los tres es el" . $mayor;

    ?>

    <!--
Otro tema sería decir por ejemplo "El mayor es el primero", porque si hay dos o tres iguales la frase no sería cierta
y tendría que discriminar si hay iguales, cuáles son... etc
Sin embargo así expresado nos da igual que haya dígitos iguales
  -->


</body>

</html>


EJERCICIO 2:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>IMC con dibujo</title>
</head>

<body>

    <form action="index.php" method="post">

        <input type="number" name="peso" step=0.001>
        <input type="number" name="altura" step=0.01>
        <input type="submit" value="Enviar">
    </form>



    <?php
    $peso = $_POST['peso'];
    $altura = $_POST['altura'];
    $imc = $peso / ($altura * $altura);
    echo "Midiendo {$altura} y con un peso de {$peso} tienes un IMC de " . $imc . "<br>";

    if ($imc < "18.5") {

        echo "Tienes un peso muy bajo";
        echo '<img src="bajopeso.png">';
    }


    if (($imc == "18.5") && ($imc < "25")) {

        echo "Tienes un peso normal";
        echo '<img src="normal.png">';
    }

    if (($imc == "25") && ($imc < "30")) {

        echo "Tienes algo de sobrepeso";
        echo '<img src="sobrepeso.png">';
    }

    if (($imc == "30") && ($imc < "35")) {

        echo "Tienes obesidad de tipo 1";
        echo '<img src="obeso1.png">';
    }

    if (($imc == "35") && ($imc < "40")) {

        echo "Tienes obesidad de tipo 2";
        echo '<img src="obeso2.png">';
    }

    if (($imc == "40") && ($imc < "50")) {

        echo "Tienes obesidad de tipo 3";
        echo '<img src="obeso3.png">';
    }

    if ($imc < "50") {

        echo "Tienes obesidad de tipo 4";
        echo '<img src="obeso4.png">';
    }

    /* Se me hace muy brasas hacer el else del else y sucesivos, lo prefiero así */


    ?>



</body>

</html>


85: comienzo las pruebas
… En el ejercicio 1 pongo el número en la respuesta, veo que no se queda a la vista ni añadiendo la línea del submit
… En el ejercicio 2 no veo la imagen y me dice que tengo obesidad de tipo 4... a revisar

Ok, en el último if veo esto:
    if ($imc < "50")

Es curioso, en vez de sacarme los echo de los dos if que cumplen la condición sólo saca uno... a ver subiendo las imágenes...

98: ah, oye, sale como lo del profesor. Y yo que iba a añadir un grid para conseguir ese efecto... Se ve que si no pones un <br> te pone los echo seguidos

100: me desaparece toda respuesta porque 101, no podemos ser iguales a y menores a la vez en esos if's
(Claro, había aplicado los rangos "literales" de los rangos de la imagen)

102: Corrijo, paso de lo primero a lo segundo en los if's intermedios:
    if (($imc == "25") && ($imc < "30")) {
    if (($imc >= "25") && ($imc < "30")) {

Actualizo en 103 (me mantiene la última información recogida en el formulario) y ya veo un buen resultado en 104

Ok, a lo mejor en ambos podría usar el isset, el is_numeric y otros filtros varios... pero por ahora va bien

EN ESTOS MOMENTOS:

EJERCICIO 1, el de los dígitos:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Dígito mayor</title>
</head>

<body>

    <!-- Ejercicio: de un número de 3 cifras entero positivo que nos diga cuál es el dígito mayor -->

    <form action="index.php" method="post">

        <input type="number" name="numero" min=100 max=999 step=1>
        <input type="submit" value="Enviar">

    </form>

    <?php

    $numero = $_POST['numero'];
    $digito3 = $numero / 100;
    $digito1 = intval($digito3);
    $digito3 = ($digito3 - $digito1) * 10;
    $digito2 = intval($digito3);
    $digito3 = ($digito3 - $digito2) * 10;

    if (($digito1 >= $digito2) && ($digito1 >= $digito3)) {
        $mayor = $digito1;
    } else if ($digito2 >= $digito3) {
        $mayor = $digito2;
    } else {
        $mayor = $digito3;
    }

    echo "El mayor dígito de los tres en {$numero} es el..."  . $mayor;

    ?>

    <!--
Otro tema sería decir por ejemplo "El mayor es el primero", porque si hay dos o tres iguales la frase no sería cierta
y tendría que discriminar si hay iguales, cuáles son... etc
Sin embargo así expresado nos da igual que haya dígitos iguales
  -->


</body>

</html>


EJERCICIO 2, el IMC mejorado:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>IMC con dibujo</title>
</head>

<body>

    <form action="index.php" method="post">

        <input type="number" name="peso" step=0.001>
        <input type="number" name="altura" step=0.01>
        <input type="submit" value="Enviar">
    </form>



    <?php
    $peso = $_POST['peso'];
    $altura = $_POST['altura'];
    $imc = $peso / ($altura * $altura);
    echo "Midiendo {$altura} y con un peso de {$peso} tienes un IMC de " . $imc . "<br>";

    if ($imc < "18.5") {

        echo "Tienes un peso muy bajo";
        echo '<img src="bajopeso.png">';
    }


    if (($imc >= "18.5") && ($imc < "25")) {

        echo "Tienes un peso normal";
        echo '<img src="normal.png">';
    }

    if (($imc >= "25") && ($imc < "30")) {

        echo "Tienes algo de sobrepeso";
        echo '<img src="sobrepeso.png">';
    }

    if (($imc >= "30") && ($imc < "35")) {

        echo "Tienes obesidad de tipo 1";
        echo '<img src="obeso1.png">';
    }

    if (($imc >= "35") && ($imc < "40")) {

        echo "Tienes obesidad de tipo 2";
        echo '<img src="obeso2.png">';
    }

    if (($imc >= "40") && ($imc < "50")) {

        echo "Tienes obesidad de tipo 3";
        echo '<img src="obeso3.png">';
    }

    if ($imc >= "50") {

        echo "Tienes obesidad de tipo 4";
        echo '<img src="obeso4.png">';
    }

    /* Se me hace muy brasas hacer el else del else y sucesivos, lo prefiero así */


    ?>



</body>

</html>



113: ESTADO DEL EJERCICIO 2:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>IMC con dibujo</title>
</head>

<body>

    <form action="index.php" method="post">

        <input type="number" name="peso" step=0.001 placeholder="Peso en kgs">
        <input type="number" name="altura" step=0.01 placeholder="Altura en metros">
        <input type="submit" value="Enviar">
    </form>



    <?php
    $peso = $_POST['peso'];
    $altura = $_POST['altura'];
    $imc = $peso / ($altura * $altura);
    echo "Midiendo {$altura} y con un peso de {$peso} tienes un IMC de " . $imc . "<br>";

    if ($imc < "18.5") {

        echo "Tienes un peso muy bajo";
        echo '<img src="bajopeso.png">';
    }


    if (($imc >= "18.5") && ($imc < "25")) {

        echo "Tienes un peso normal";
        echo '<img src="normal.png">';
    }

    if (($imc >= "25") && ($imc < "30")) {

        echo "Tienes algo de sobrepeso";
        echo '<img src="sobrepeso.png">';
    }

    if (($imc >= "30") && ($imc < "35")) {

        echo "Tienes obesidad de tipo 1";
        echo '<img src="obeso1.png">';
    }

    if (($imc >= "35") && ($imc < "40")) {

        echo "Tienes obesidad de tipo 2";
        echo '<img src="obeso2.png">';
    }

    if (($imc >= "40") && ($imc < "50")) {

        echo "Tienes obesidad de tipo 3";
        echo '<img src="obeso3.png">';
    }

    if ($imc >= "50") {

        echo "Tienes obesidad de tipo 4";
        echo '<img src="obeso4.png">';
    }

    /* Se me hace muy brasas hacer el else del else y sucesivos, lo prefiero así */


    ?>



</body>

</html>



No utilizar como nombre de host el dominio que tengamos como principal, eso nos va a facilitar cierto tipo de gestiones.


https://alejandro.avisando.com/php/if/trescifras.php

https://alejandro.avisando.com/php/if/imc/index.php


*** Día 25/11/2025

16 es usando un array (variable que puede almacenar varios valores)
En el ejemplo tiene que empezar necesariamente por 0, ese es el primer dígito

Y
//otra solución
es un comentario de una línea

echo $b; da un error si $b es un array, para eso está print
Podríamos hacer echo $b[0];

Como teníamos el número en una variable alfanumérica y todos los strings son arrays... por eso se puede usar ese código, porque para 589
$numero = ['5', '8', '9'];



Buscando "php dar valores a un array" sale esto:

Usando corchetes []: Esta es la sintaxis más moderna y concisa.
Arreglo indexado: $frutas = ['manzana', 'banana', 'naranja'];.
Arreglo asociativo: $persona = ['nombre' => 'Juan', 'edad' => 30, 'ciudad' => 'Madrid'];.

Usando la palabra reservada array(): Es la sintaxis más antigua pero funcional.
$colores = array('rojo', 'verde', 'azul');. 


Con 18 evitamos los errores de inicio, algo como lo que me sale a mí en 27


EJERCICIO:
Un select con fácil, normal y complicado
Otro con suma, resta y multiplicación
El resultado serán 10 operaciones de ese tipo, para que salga el resultado
Botón de Corregir y que nos ponga lo correcto en verde y lo incorrecto en rojo

Pues no, lo dejamos en sólo sumas y fácil, normal y complicado, para 1, 2 y 3 cifras


https://www.php.net/manual/es/function.rand.php
$n=rand (5,10);

3GHz de procesador son 3000 vueltas por segundo, y si buscamos un número aleatorio de 1 a 100 lo que hace es coger el módulo de la división del giro de ese momento (raíz en C) entre 100 y sumarle 1


40: descarto el select, no me deja coger su valor después

43: Y marque lo que marque mo me quiere

47: parece que no te deja meter ni main ni section dentro del php... así que habrá que hacerlo al revés y meter el php dentro del section

51 es el estado de index2.php
52 es tras sacar los form de cada section y cambiarlos por uno exterior a todos los section (53), además así también podemos meter el botón de Corregir


<?php
echo "Dr.&nbsp;Einstein"; // Mostrará "Dr. Einstein" con un espacio que no se romperá
?>


*** Día 26/11/2025

LOS INDEX DE AYER:
PRIMERA FASE, muy de inicio:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Cuaderno Rubio</title>
</head>

<body>

    <h2> Escoge el nivel de dificultad </h2>
    <!-- <select name="dificultad" required>
        <option value="1"> Fácil </option>
        <option value="10"> Normal </option>
        <option value="100"> Complicado </option>
    </select>
 -->

    <form action="index.php" method="post">

        <ol>

            <li> Fácil <input type="radio" name="dificultad" value="1"> </li>
            <li> Normal <input type="radio" name="dificultad" value="10"> </li>
            <li> Complicado <input type="radio" name="dificultad" value="100"> </li>
        </ol>

        <!--                     <input type="number" name="numero" min=100 max=999 step=1>
        <input type="submit" value="Enviar"> -->

    </form>

<?php 

echo $_POST['dificultad'];

?>



</body>

</html>


SEGUNDA FASE, antes de sacar fuera los form:
<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Cuaderno Rubio</title>
    <link rel="stylesheet" href="style.css">
</head>

<body>

    <h2> Escoge el nivel de dificultad </h2>
    <ol>

        <li> Fácil </li>
        <li> Normal </li>
        <li> Complicado </li>
    </ol>

    <form action="index.php" method="post">

        <input type="number" name="dificultad" min=1 max=3 step=1>
        <input type="submit" value="Enviar">

    </form>

    <?php

    if ($_POST['dificultad'] == 1) {
        $lim1 = "1";
        $lim2 = "9";
    } elseif ($_POST['dificultad'] == 2) {
        $lim1 = "10";
        $lim2 = "99";
    } else {
        $lim1 = "100";
        $lim2 = "999";
    }

    $sum1[0] = rand($lim1, $lim2);
    $sum1[1] = rand($lim1, $lim2);
    $sum1[2] = rand($lim1, $lim2);
    $sum1[3] = rand($lim1, $lim2);
    $sum1[4] = rand($lim1, $lim2);
    $sum1[5] = rand($lim1, $lim2);
    $sum1[6] = rand($lim1, $lim2);
    $sum1[7] = rand($lim1, $lim2);
    $sum1[8] = rand($lim1, $lim2);
    $sum1[9] = rand($lim1, $lim2);

    $sum2[0] = rand($lim1, $lim2);
    $sum2[1] = rand($lim1, $lim2);
    $sum2[2] = rand($lim1, $lim2);
    $sum2[3] = rand($lim1, $lim2);
    $sum2[4] = rand($lim1, $lim2);
    $sum2[5] = rand($lim1, $lim2);
    $sum2[6] = rand($lim1, $lim2);
    $sum2[7] = rand($lim1, $lim2);
    $sum2[8] = rand($lim1, $lim2);
    $sum2[9] = rand($lim1, $lim2);


    ?>

    <section class="suma">

        <?php

        echo $sum1[0];
        echo "+";
        echo $sum2[0];
        ?>
        <form action="index.php" method="post">
            <input type="number" name="res0" placeholder="resultado">
        </form>

        <?php
        $res[0] = $_POST['res0'];
        ?>


    </section>


    <section class="suma">

        <?php

        echo $sum1[1];
        echo "+";
        echo $sum2[1];
        ?>
        <form action="index.php" method="post">
            <input type="number" name="res1" placeholder="resultado">
        </form>

        <?php
        $res[1] = $_POST['res1'];
        ?>


    </section>

    <section class="suma">

        <?php

        echo $sum1[2];
        echo "+";
        echo $sum2[2];
        ?>
        <form action="index.php" method="post">
            <input type="number" name="res2" placeholder="resultado">
        </form>

        <?php
        $res[2] = $_POST['res2'];
        ?>


    </section>

    <section class="suma">

        <?php

        echo $sum1[3];
        echo "+";
        echo $sum2[3];
        ?>
        <form action="index.php" method="post">
            <input type="number" name="res3" placeholder="resultado">
        </form>

        <?php
        $res[3] = $_POST['res3'];
        ?>


    </section>

    <section class="suma">

        <?php

        echo $sum1[4];
        echo "+";
        echo $sum2[4];
        ?>
        <form action="index.php" method="post">
            <input type="number" name="res4" placeholder="resultado">
        </form>

        <?php
        $res[4] = $_POST['res4'];
        ?>


    </section>

    <section class="suma">

        <?php

        echo $sum1[5];
        echo "+";
        echo $sum2[5];
        ?>
        <form action="index.php" method="post">
            <input type="number" name="res5" placeholder="resultado">
        </form>

        <?php
        $res[5] = $_POST['res5'];
        ?>


    </section>

    <section class="suma">

        <?php

        echo $sum1[6];
        echo "+";
        echo $sum2[6];
        ?>
        <form action="index.php" method="post">
            <input type="number" name="res6" placeholder="resultado">
        </form>

        <?php
        $res[6] = $_POST['res6'];
        ?>


    </section>

    <section class="suma">

        <?php

        echo $sum1[7];
        echo "+";
        echo $sum2[7];
        ?>
        <form action="index.php" method="post">
            <input type="number" name="res7" placeholder="resultado">
        </form>

        <?php
        $res[7] = $_POST['res7'];
        ?>


    </section>

    <section class="suma">

        <?php

        echo $sum1[8];
        echo "+";
        echo $sum2[8];
        ?>
        <form action="index.php" method="post">
            <input type="number" name="res8" placeholder="resultado">
        </form>

        <?php
        $res[8] = $_POST['res8'];
        ?>


    </section>

    <section class="suma">

        <?php

        echo $sum1[9];
        echo "+";
        echo $sum2[9];
        ?>
        <form action="index.php" method="post">
            <input type="number" name="res9" placeholder="resultado">
        </form>

        <?php
        $res[9] = $_POST['res9'];
        ?>


    </section>





</body>

</html>


AL FINAL DE AYER, tras sacar los form:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Cuaderno Rubio</title>
    <link rel="stylesheet" href="style.css">
</head>

<body>

    <h2> Escoge el nivel de dificultad </h2>
    <ol>

        <li> Fácil </li>
        <li> Normal </li>
        <li> Complicado </li>
    </ol>

    <form action="index.php" method="post">

        <input type="number" name="dificultad" min=1 max=3 step=1>
        <input type="submit" value="Enviar">

    </form>

    <?php

    if ($_POST['dificultad'] == 1) {
        $lim1 = "1";
        $lim2 = "9";
    } elseif ($_POST['dificultad'] == 2) {
        $lim1 = "10";
        $lim2 = "99";
    } else {
        $lim1 = "100";
        $lim2 = "999";
    }

    $sum1[0] = rand($lim1, $lim2);
    $sum1[1] = rand($lim1, $lim2);
    $sum1[2] = rand($lim1, $lim2);
    $sum1[3] = rand($lim1, $lim2);
    $sum1[4] = rand($lim1, $lim2);
    $sum1[5] = rand($lim1, $lim2);
    $sum1[6] = rand($lim1, $lim2);
    $sum1[7] = rand($lim1, $lim2);
    $sum1[8] = rand($lim1, $lim2);
    $sum1[9] = rand($lim1, $lim2);

    $sum2[0] = rand($lim1, $lim2);
    $sum2[1] = rand($lim1, $lim2);
    $sum2[2] = rand($lim1, $lim2);
    $sum2[3] = rand($lim1, $lim2);
    $sum2[4] = rand($lim1, $lim2);
    $sum2[5] = rand($lim1, $lim2);
    $sum2[6] = rand($lim1, $lim2);
    $sum2[7] = rand($lim1, $lim2);
    $sum2[8] = rand($lim1, $lim2);
    $sum2[9] = rand($lim1, $lim2);


    ?>


    <form action="index.php" method="post">

        <div id="tabla">
            <section class="suma">

                <?php
                echo "&nbsp;" . $sum1[0] . "<br>+" . $sum2[0] . "<br>";
                ?>

                <input type="number" name="res0" placeholder="resultado">

            </section>


            <section class="suma">

                <?php
                echo "&nbsp;" . $sum1[1] . "<br>+" . $sum2[1] . "<br>";
                ?>

                <input type="number" name="res1" placeholder="resultado">

            </section>

            <section class="suma">

                <?php
                echo "&nbsp;" . $sum1[2] . "<br>+" . $sum2[2] . "<br>";
                ?>

                <input type="number" name="res2" placeholder="resultado">

            </section>

            <section class="suma">

                <?php
                echo "&nbsp;" . $sum1[3] . "<br>+" . $sum2[3] . "<br>";
                ?>

                <input type="number" name="res3" placeholder="resultado">

            </section>

            <section class="suma">

                <?php
                echo "&nbsp;" . $sum1[4] . "<br>+" . $sum2[4] . "<br>";
                ?>

                <input type="number" name="res4" placeholder="resultado">

            </section>

            <section class="suma">

                <?php
                echo "&nbsp;" . $sum1[5] . "<br>+" . $sum2[5] . "<br>";
                ?>

                <input type="number" name="res5" placeholder="resultado">

            </section>

            <section class="suma">

                <?php
                echo "&nbsp;" . $sum1[6] . "<br>+" . $sum2[6] . "<br>";
                ?>

                <input type="number" name="res6" placeholder="resultado">

            </section>

            <section class="suma">

                <?php
                echo "&nbsp;" . $sum1[7] . "<br>+" . $sum2[7] . "<br>";
                ?>

                <input type="number" name="res7" placeholder="resultado">

            </section>

            <section class="suma">

                <?php
                echo "&nbsp;" . $sum1[8] . "<br>+" . $sum2[8] . "<br>";
                ?>

                <input type="number" name="res8" placeholder="resultado">

            </section>

            <section class="suma">

                <?php
                echo "&nbsp;" . $sum1[9] . "<br>+" . $sum2[9] . "<br>";
                ?>

                <input type="number" name="res9" placeholder="resultado">

            </section>
        </div>

        <input type="submit" value="Corregir">

    </form>

    <?php
    $res[0] = $_POST['res0'];
    $res[1] = $_POST['res1'];
    $res[2] = $_POST['res2'];
    $res[3] = $_POST['res3'];
    $res[4] = $_POST['res4'];
    $res[5] = $_POST['res5'];
    $res[6] = $_POST['res6'];
    $res[7] = $_POST['res7'];
    $res[8] = $_POST['res8'];
    $res[9] = $_POST['res9'];
    ?>






</body>

</html>


*{
box-sizing: border-box;

}

#tabla{
margin-top: 30px;
display: grid;
grid-template-columns: repeat(5, 1fr);
margin-bottom: 30px;
}



27 a 29: El input submit es sólo para el envío, el button puede conllevar más aciones. Si no les añades nada también hacen sólo el envío

42 es lo mismo que 43

72 a 73: no hace falta botón de retorno, al actuar sobre el desplegable del header te devuelve de nuevo al index

90 tras un value="10" que le ha añadido al input de cantidad, el que se ve en 96 y 97
En 98 vemos que se han generado arrays

101: foreach es un bucle especial para recorrer arrays


EJERCICIO: añadir resta (sin negativos), multiplicación y división (con dividendo mayor que el divisor y que nos dé cociente y resto (sólo usaremos divisiones enteras)


128 y 129: en solución.php no me reconoce las variables de index.php, sólo se pueden traspasar variables de un fichero a otro mediante cookies y variables de sesión, que todavía no hemos visto. Así que sólo se pasará de un fichero a otro las variables del formulario... entonces por eso teníamos los input hidden de 133, los:
<p><?php echo $o1; ?> <input type="hidden" name="operador_<?php echo $operacion; ?>_1" value="<?php echo $o1; ?>"></p>
<p>+ <?php echo $o2; ?> <input type="hidden" name="operador_<?php echo $operacion; ?>_2" value="<?php echo $o2; ?>"></p>
 
Da igual que meta la definición de variables dentro del form como en 132, tampoco funciona

134 es intentando reemplazar

134 a 136: efectivamente, meto los input hidden, redefino las variables en el nuevo fichero... y ya tengo el objetivo buscado
Además en 136 veo que la suma 3 sale con fondo verde y las demás con fondo rojo... es porque tengo el cambio de $class a ko dentro del div con $class, y luego jamás redefino a ok, jejeje. Le pondré unos else en bloque


*** Día 27/11/2025

Al final del día de ayer, creo que ya tengo la operatividad de las sumas:

INDEX:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Cuaderno Rubio</title>
    <link rel="stylesheet" href="style.css">
</head>

<body>

    <h2> Escoge el nivel de dificultad </h2>
    <ol>

        <li> Fácil </li>
        <li> Normal </li>
        <li> Complicado </li>
    </ol>

    <form action="index.php" method="post">

        <input type="number" name="dificultad" min=1 max=3 step=1>
        <input type="submit" value="Enviar">

    </form>

    <?php

    if ($_POST['dificultad'] == 1) {
        $lim1 = "1";
        $lim2 = "9";
    } elseif ($_POST['dificultad'] == 2) {
        $lim1 = "10";
        $lim2 = "99";
    } else {
        $lim1 = "100";
        $lim2 = "999";
    }

    $sum1[0] = rand($lim1, $lim2);
    $sum1[1] = rand($lim1, $lim2);
    $sum1[2] = rand($lim1, $lim2);
    $sum1[3] = rand($lim1, $lim2);
    $sum1[4] = rand($lim1, $lim2);
    $sum1[5] = rand($lim1, $lim2);
    $sum1[6] = rand($lim1, $lim2);
    $sum1[7] = rand($lim1, $lim2);
    $sum1[8] = rand($lim1, $lim2);
    $sum1[9] = rand($lim1, $lim2);

    $sum2[0] = rand($lim1, $lim2);
    $sum2[1] = rand($lim1, $lim2);
    $sum2[2] = rand($lim1, $lim2);
    $sum2[3] = rand($lim1, $lim2);
    $sum2[4] = rand($lim1, $lim2);
    $sum2[5] = rand($lim1, $lim2);
    $sum2[6] = rand($lim1, $lim2);
    $sum2[7] = rand($lim1, $lim2);
    $sum2[8] = rand($lim1, $lim2);
    $sum2[9] = rand($lim1, $lim2);


    ?>


    <form action="soluciones.php" method="post">

        <div id="tabla">
            <section class="suma">

                <?php
                echo "&nbsp;" . $sum1[0] . "<br>+" . $sum2[0] . "<br>";
                ?>
                <input type="hidden" name="operador_0_1" value="<?php echo $sum1[0]; ?>">
                <input type="hidden" name="operador_0_2" value="<?php echo $sum2[0]; ?>">
                <input type="number" name="res0" placeholder="resultado">

            </section>


            <section class="suma">

                <?php
                echo "&nbsp;" . $sum1[1] . "<br>+" . $sum2[1] . "<br>";
                ?>
                <input type="hidden" name="operador_1_1" value="<?php echo $sum1[1]; ?>">
                <input type="hidden" name="operador_1_2" value="<?php echo $sum2[1]; ?>">
                <input type="number" name="res1" placeholder="resultado">

            </section>

            <section class="suma">

                <?php
                echo "&nbsp;" . $sum1[2] . "<br>+" . $sum2[2] . "<br>";
                ?>
                <input type="hidden" name="operador_2_1" value="<?php echo $sum1[2]; ?>">
                <input type="hidden" name="operador_2_2" value="<?php echo $sum2[2]; ?>">
                <input type="number" name="res2" placeholder="resultado">

            </section>

            <section class="suma">

                <?php
                echo "&nbsp;" . $sum1[3] . "<br>+" . $sum2[3] . "<br>";
                ?>
                <input type="hidden" name="operador_3_1" value="<?php echo $sum1[3]; ?>">
                <input type="hidden" name="operador_3_2" value="<?php echo $sum2[3]; ?>">
                <input type="number" name="res3" placeholder="resultado">

            </section>

            <section class="suma">

                <?php
                echo "&nbsp;" . $sum1[4] . "<br>+" . $sum2[4] . "<br>";
                ?>
                <input type="hidden" name="operador_4_1" value="<?php echo $sum1[4]; ?>">
                <input type="hidden" name="operador_4_2" value="<?php echo $sum2[4]; ?>">
                <input type="number" name="res4" placeholder="resultado">

            </section>

            <section class="suma">

                <?php
                echo "&nbsp;" . $sum1[5] . "<br>+" . $sum2[5] . "<br>";
                ?>
                <input type="hidden" name="operador_5_1" value="<?php echo $sum1[5]; ?>">
                <input type="hidden" name="operador_5_2" value="<?php echo $sum2[5]; ?>">
                <input type="number" name="res5" placeholder="resultado">

            </section>

            <section class="suma">

                <?php
                echo "&nbsp;" . $sum1[6] . "<br>+" . $sum2[6] . "<br>";
                ?>
                <input type="hidden" name="operador_6_1" value="<?php echo $sum1[6]; ?>">
                <input type="hidden" name="operador_6_2" value="<?php echo $sum2[6]; ?>">
                <input type="number" name="res6" placeholder="resultado">

            </section>

            <section class="suma">

                <?php
                echo "&nbsp;" . $sum1[7] . "<br>+" . $sum2[7] . "<br>";
                ?>
                <input type="hidden" name="operador_7_1" value="<?php echo $sum1[7]; ?>">
                <input type="hidden" name="operador_7_2" value="<?php echo $sum2[7]; ?>">
                <input type="number" name="res7" placeholder="resultado">

            </section>

            <section class="suma">

                <?php
                echo "&nbsp;" . $sum1[8] . "<br>+" . $sum2[8] . "<br>";
                ?>
                <input type="hidden" name="operador_8_1" value="<?php echo $sum1[8]; ?>">
                <input type="hidden" name="operador_8_2" value="<?php echo $sum2[8]; ?>">
                <input type="number" name="res8" placeholder="resultado">

            </section>

            <section class="suma">

                <?php
                echo "&nbsp;" . $sum1[9] . "<br>+" . $sum2[9] . "<br>";
                ?>
                <input type="hidden" name="operador_9_1" value="<?php echo $sum1[9]; ?>">
                <input type="hidden" name="operador_9_2" value="<?php echo $sum2[9]; ?>">
                <input type="number" name="res9" placeholder="resultado">

            </section>
        </div>

        <input type="submit" value="Corregir">

    </form>

    <?php
    $res[0] = $_POST['res0'];
    $res[1] = $_POST['res1'];
    $res[2] = $_POST['res2'];
    $res[3] = $_POST['res3'];
    $res[4] = $_POST['res4'];
    $res[5] = $_POST['res5'];
    $res[6] = $_POST['res6'];
    $res[7] = $_POST['res7'];
    $res[8] = $_POST['res8'];
    $res[9] = $_POST['res9'];
    ?>






</body>

</html>

SOLUCIONES:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Cuaderno Rubio</title>
    <link rel="stylesheet" href="style.css">
</head>

<body>

    <h2> Escoge el nivel de dificultad </h2>
    <ol>

        <li> Fácil </li>
        <li> Normal </li>
        <li> Complicado </li>
    </ol>

    <form action="index.php" method="post">

        <input type="number" name="dificultad" min=1 max=3 step=1>
        <input type="submit" value="Enviar">

    </form>



    <?php


    $sum1[0] = $_POST['operador_0_1'];
    $sum1[1] = $_POST['operador_1_1'];
    $sum1[2] = $_POST['operador_2_1'];
    $sum1[3] = $_POST['operador_3_1'];
    $sum1[4] = $_POST['operador_4_1'];
    $sum1[5] = $_POST['operador_5_1'];
    $sum1[6] = $_POST['operador_6_1'];
    $sum1[7] = $_POST['operador_7_1'];
    $sum1[8] = $_POST['operador_8_1'];
    $sum1[9] = $_POST['operador_9_1'];

    $sum2[0] = $_POST['operador_0_2'];
    $sum2[1] = $_POST['operador_1_2'];
    $sum2[2] = $_POST['operador_2_2'];
    $sum2[3] = $_POST['operador_3_2'];
    $sum2[4] = $_POST['operador_4_2'];
    $sum2[5] = $_POST['operador_5_2'];
    $sum2[6] = $_POST['operador_6_2'];
    $sum2[7] = $_POST['operador_7_2'];
    $sum2[8] = $_POST['operador_8_2'];
    $sum2[9] = $_POST['operador_9_2'];

    $res[0] = $_POST['res0'];
    $res[1] = $_POST['res1'];
    $res[2] = $_POST['res2'];
    $res[3] = $_POST['res3'];
    $res[4] = $_POST['res4'];
    $res[5] = $_POST['res5'];
    $res[6] = $_POST['res6'];
    $res[7] = $_POST['res7'];
    $res[8] = $_POST['res8'];
    $res[9] = $_POST['res9'];
    ?>




    <?php
    $class = "ok";
    ?>

    <form action="soluciones.php" method="post">
        <div id="tabla">


            <?php
            if (($sum1[0] + $sum2[0]) <> $res[0]) {
                $class = "ko";
            } else {
                $class = "ok";
            }
            ?>

            <section class="<?php echo $class; ?>">

                <?php

                echo "&nbsp;" . $sum1[0] . "<br>+" . $sum2[0] . "<br>" . $res[0];
                ?>

            </section>


            <?php
            if (($sum1[1] + $sum2[1]) <> $res[1]) {
                $class = "ko";
            } else {
                $class = "ok";
            }
            ?>

            <section class="<?php echo $class; ?>">

                <?php

                echo "&nbsp;" . $sum1[1] . "<br>+" . $sum2[1] . "<br>" . $res[1];
                ?>

            </section>

            <?php
            if (($sum1[2] + $sum2[2]) <> $res[2]) {
                $class = "ko";
            } else {
                $class = "ok";
            }
            ?>

            <section class="<?php echo $class; ?>">

                <?php

                echo "&nbsp;" . $sum1[2] . "<br>+" . $sum2[2] . "<br>" . $res[2];
                ?>

            </section>

            <?php
            if (($sum1[3] + $sum2[3]) <> $res[3]) {
                $class = "ko";
            } else {
                $class = "ok";
            }
            ?>

            <section class="<?php echo $class; ?>">

                <?php

                echo "&nbsp;" . $sum1[3] . "<br>+" . $sum2[3] . "<br>" . $res[3];
                ?>

            </section>

            <?php
            if (($sum1[4] + $sum2[4]) <> $res[4]) {
                $class = "ko";
            } else {
                $class = "ok";
            }
            ?>

            <section class="<?php echo $class; ?>">

                <?php

                echo "&nbsp;" . $sum1[4] . "<br>+" . $sum2[4] . "<br>" . $res[4];
                ?>

            </section>

            <?php
            if (($sum1[5] + $sum2[5]) <> $res[5]) {
                $class = "ko";
            } else {
                $class = "ok";
            }
            ?>

            <section class="<?php echo $class; ?>">

                <?php

                echo "&nbsp;" . $sum1[5] . "<br>+" . $sum2[5] . "<br>" . $res[5];
                ?>

            </section>

            <?php
            if (($sum1[6] + $sum2[6]) <> $res[6]) {
                $class = "ko";
            } else {
                $class = "ok";
            }
            ?>

            <section class="<?php echo $class; ?>">

                <?php

                echo "&nbsp;" . $sum1[6] . "<br>+" . $sum2[6] . "<br>" . $res[6];
                ?>

            </section>

            <?php
            if (($sum1[7] + $sum2[7]) <> $res[7]) {
                $class = "ko";
            } else {
                $class = "ok";
            }
            ?>

            <section class="<?php echo $class; ?>">

                <?php

                echo "&nbsp;" . $sum1[7] . "<br>+" . $sum2[7] . "<br>" . $res[7];
                ?>

            </section>

            <?php
            if (($sum1[8] + $sum2[8]) <> $res[8]) {
                $class = "ko";
            } else {
                $class = "ok";
            }
            ?>

            <section class="<?php echo $class; ?>">

                <?php

                echo "&nbsp;" . $sum1[8] . "<br>+" . $sum2[8] . "<br>" . $res[8];
                ?>

            </section>

            <?php
            if (($sum1[9] + $sum2[9]) <> $res[9]) {
                $class = "ko";
            } else {
                $class = "ok";
            }
            ?>

            <section class="<?php echo $class; ?>">

                <?php

                echo "&nbsp;" . $sum1[9] . "<br>+" . $sum2[9] . "<br>" . $res[9];
                ?>

            </section>
        </div>
    </form>


</body>

</html>

STYLE:
*{
box-sizing: border-box;

}

#tabla{
margin-top: 30px;
display: grid;
grid-template-columns: repeat(5, 1fr);
margin-bottom: 30px;
}

.ok{
background-color: green;    
}

.ko{
background-color: red;    
}


Ideas varias:
Resta como suma pero intercambiando factores si es necesario
Multiplicación como suma, sin alteraciones
División añadiendo la petición, transferencia y comprobación del módulo/resto
... bueno, y añadir el otro desplegable, el de seleccionar la operación


5 a 7: el head parece que no acepta estilos, y Alfonso lo metió en el header del body... a probarlo así... pero por lo que sea no me lo hace... por ahora paso a otra cosa

9 y 10: y atentos que aparte de poder expresar parámetros del input metiendo un php puedo meter las dos llaves del if de esta forma, oye. Y parece que me lo coge.
(Una pena que dentro de cada bloque PHP no puedas meter etiquetas HTML)

16: 200 es respuesta correcta, 400 y 500 las incorrectas

19: el json es lo que devuelve Hacienda


Aquí algunas expresiones, sólo porue en VSCode me pierdo con tanto paréntesis de paréntesis:
if (($sum1[0] / $sum2[0]) <> $res[0]) {
if ((($sum1[0]-($sum1[0]%$sum2[0]))/ $sum2[0]) <> $res[0]) {
if (($sum1[0]%$sum2[0])<>$modulo[0]) {


39: Vaya, p admite class pero no dentro de un <?php (el segundo echo de esta parte)... tendré que modificar un poco estos section

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[0] . "<br>:" . $sum2[0] . "<br>" . $res[0];                
                    echo "<br><p class="1">".$modulo[0]."</p>";
                    ?>

                </section>


Entiendo que debería pasar a meter esto dentro del section pero tras el ?>
                    <br><p class="<?php echo $classres; ?>">
                    <?php echo $modulo[0]."</p>"; ?>
A ver qué tal, lo pego en VSCode
... perfecto (en el sentido de que no da errores y me deja continuar)

40: ah, ok, no tengo que modificar nada aquí, $class y $classres sólo son las variables que almacenan las clases, pero las clases siguen siendo ok y ko

42: y después de no aplicarme el grid de 48 anteriormente... ahora me lo aplica sin cambiar nada. Mejor. No sé, tal vez si hubiera reiniciado Chrome antes también hubiera funcionado, pienso.

En <head> sólo meteremos temas de configuración, nada que salga en la página, nada del <header>. A mí hoy me salían cosas que metí en el <head>, pero a lo mejor un navegador lo renderiza y otro no. Ok_


FICHEROS FINALES:

EL INDEX:
<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Cuaderno Rubio</title>
    <link rel="stylesheet" href="style.css">




</head>

<body>

    <header>
        <div>

            <h2> Escoge la operación a procesar </h2>
            <ol>

                <li> Sumas </li>
                <li> Restas </li>
                <li> Multiplicaciones </li>
                <li> Divisiones enteras </li>
            </ol>

            <form action="index.php" method="post">

                <input type="number" name="regla" min=1 max=4 step=1>
                <input type="submit" value="Enviar">

            </form>

            <?php
            $regla = $_POST['regla'];
            ?>

        </div>


        <div>

            <h2> Escoge el nivel de dificultad </h2>
            <ol>

                <li> Fácil </li>
                <li> Normal </li>
                <li> Complicado </li>
            </ol>

            <form action="index.php" method="post">

                <input type="number" name="dificultad" min=1 max=3 step=1>
                <input type="submit" value="Enviar">

            </form>

            <?php

            if ($_POST['dificultad'] == 1) {
                $lim1 = "1";
                $lim2 = "9";
            } elseif ($_POST['dificultad'] == 2) {
                $lim1 = "10";
                $lim2 = "99";
            } else {
                $lim1 = "100";
                $lim2 = "999";
            }

            ?>

        </div>
    </header>

    <?php
    if ($regla == 1) {
    ?>

        <?php
        $sum1[0] = rand($lim1, $lim2);
        $sum1[1] = rand($lim1, $lim2);
        $sum1[2] = rand($lim1, $lim2);
        $sum1[3] = rand($lim1, $lim2);
        $sum1[4] = rand($lim1, $lim2);
        $sum1[5] = rand($lim1, $lim2);
        $sum1[6] = rand($lim1, $lim2);
        $sum1[7] = rand($lim1, $lim2);
        $sum1[8] = rand($lim1, $lim2);
        $sum1[9] = rand($lim1, $lim2);

        $sum2[0] = rand($lim1, $lim2);
        $sum2[1] = rand($lim1, $lim2);
        $sum2[2] = rand($lim1, $lim2);
        $sum2[3] = rand($lim1, $lim2);
        $sum2[4] = rand($lim1, $lim2);
        $sum2[5] = rand($lim1, $lim2);
        $sum2[6] = rand($lim1, $lim2);
        $sum2[7] = rand($lim1, $lim2);
        $sum2[8] = rand($lim1, $lim2);
        $sum2[9] = rand($lim1, $lim2);


        ?>


        <form action="soluciones.php" method="post">
            <input type="hidden" name="regla" value="1">
            <div id="tabla">
                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[0] . "<br>+" . $sum2[0] . "<br>";
                    ?>
                    <input type="hidden" name="operador_0_1" value="<?php echo $sum1[0]; ?>">
                    <input type="hidden" name="operador_0_2" value="<?php echo $sum2[0]; ?>">
                    <input type="number" name="res0" placeholder="resultado">

                </section>


                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[1] . "<br>+" . $sum2[1] . "<br>";
                    ?>
                    <input type="hidden" name="operador_1_1" value="<?php echo $sum1[1]; ?>">
                    <input type="hidden" name="operador_1_2" value="<?php echo $sum2[1]; ?>">
                    <input type="number" name="res1" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[2] . "<br>+" . $sum2[2] . "<br>";
                    ?>
                    <input type="hidden" name="operador_2_1" value="<?php echo $sum1[2]; ?>">
                    <input type="hidden" name="operador_2_2" value="<?php echo $sum2[2]; ?>">
                    <input type="number" name="res2" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[3] . "<br>+" . $sum2[3] . "<br>";
                    ?>
                    <input type="hidden" name="operador_3_1" value="<?php echo $sum1[3]; ?>">
                    <input type="hidden" name="operador_3_2" value="<?php echo $sum2[3]; ?>">
                    <input type="number" name="res3" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[4] . "<br>+" . $sum2[4] . "<br>";
                    ?>
                    <input type="hidden" name="operador_4_1" value="<?php echo $sum1[4]; ?>">
                    <input type="hidden" name="operador_4_2" value="<?php echo $sum2[4]; ?>">
                    <input type="number" name="res4" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[5] . "<br>+" . $sum2[5] . "<br>";
                    ?>
                    <input type="hidden" name="operador_5_1" value="<?php echo $sum1[5]; ?>">
                    <input type="hidden" name="operador_5_2" value="<?php echo $sum2[5]; ?>">
                    <input type="number" name="res5" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[6] . "<br>+" . $sum2[6] . "<br>";
                    ?>
                    <input type="hidden" name="operador_6_1" value="<?php echo $sum1[6]; ?>">
                    <input type="hidden" name="operador_6_2" value="<?php echo $sum2[6]; ?>">
                    <input type="number" name="res6" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[7] . "<br>+" . $sum2[7] . "<br>";
                    ?>
                    <input type="hidden" name="operador_7_1" value="<?php echo $sum1[7]; ?>">
                    <input type="hidden" name="operador_7_2" value="<?php echo $sum2[7]; ?>">
                    <input type="number" name="res7" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[8] . "<br>+" . $sum2[8] . "<br>";
                    ?>
                    <input type="hidden" name="operador_8_1" value="<?php echo $sum1[8]; ?>">
                    <input type="hidden" name="operador_8_2" value="<?php echo $sum2[8]; ?>">
                    <input type="number" name="res8" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[9] . "<br>+" . $sum2[9] . "<br>";
                    ?>
                    <input type="hidden" name="operador_9_1" value="<?php echo $sum1[9]; ?>">
                    <input type="hidden" name="operador_9_2" value="<?php echo $sum2[9]; ?>">
                    <input type="number" name="res9" placeholder="resultado">

                </section>
            </div>

            <input type="submit" value="Corregir">

        </form>

    <?php
        $res[0] = $_POST['res0'];
        $res[1] = $_POST['res1'];
        $res[2] = $_POST['res2'];
        $res[3] = $_POST['res3'];
        $res[4] = $_POST['res4'];
        $res[5] = $_POST['res5'];
        $res[6] = $_POST['res6'];
        $res[7] = $_POST['res7'];
        $res[8] = $_POST['res8'];
        $res[9] = $_POST['res9'];
    }
    ?>


    <?php
    if ($regla == 2) {
    ?>

        <?php
        $sum1[0] = rand($lim1, $lim2);
        $sum1[1] = rand($lim1, $lim2);
        $sum1[2] = rand($lim1, $lim2);
        $sum1[3] = rand($lim1, $lim2);
        $sum1[4] = rand($lim1, $lim2);
        $sum1[5] = rand($lim1, $lim2);
        $sum1[6] = rand($lim1, $lim2);
        $sum1[7] = rand($lim1, $lim2);
        $sum1[8] = rand($lim1, $lim2);
        $sum1[9] = rand($lim1, $lim2);

        $sum2[0] = rand($lim1, $lim2);
        $sum2[1] = rand($lim1, $lim2);
        $sum2[2] = rand($lim1, $lim2);
        $sum2[3] = rand($lim1, $lim2);
        $sum2[4] = rand($lim1, $lim2);
        $sum2[5] = rand($lim1, $lim2);
        $sum2[6] = rand($lim1, $lim2);
        $sum2[7] = rand($lim1, $lim2);
        $sum2[8] = rand($lim1, $lim2);
        $sum2[9] = rand($lim1, $lim2);

        $transcurso = 0;

        if ($sum1[0] < $sum2[0]) {
            $transcurso = $sum1[0];
            $sum1[0] = $sum2[0];
            $sum2[0] = $transcurso;
        }

        if ($sum1[1] < $sum2[1]) {
            $transcurso = $sum1[1];
            $sum1[1] = $sum2[1];
            $sum2[1] = $transcurso;
        }

        if ($sum1[2] < $sum2[2]) {
            $transcurso = $sum1[2];
            $sum1[2] = $sum2[2];
            $sum2[2] = $transcurso;
        }

        if ($sum1[3] < $sum2[3]) {
            $transcurso = $sum1[3];
            $sum1[3] = $sum2[3];
            $sum2[3] = $transcurso;
        }

        if ($sum1[4] < $sum2[4]) {
            $transcurso = $sum1[4];
            $sum1[4] = $sum2[4];
            $sum2[4] = $transcurso;
        }

        if ($sum1[5] < $sum2[5]) {
            $transcurso = $sum1[5];
            $sum1[5] = $sum2[5];
            $sum2[5] = $transcurso;
        }

        if ($sum1[6] < $sum2[6]) {
            $transcurso = $sum1[6];
            $sum1[6] = $sum2[6];
            $sum2[6] = $transcurso;
        }

        if ($sum1[7] < $sum2[7]) {
            $transcurso = $sum1[7];
            $sum1[7] = $sum2[7];
            $sum2[7] = $transcurso;
        }

        if ($sum1[8] < $sum2[8]) {
            $transcurso = $sum1[8];
            $sum1[8] = $sum2[8];
            $sum2[8] = $transcurso;
        }

        if ($sum1[9] < $sum2[9]) {
            $transcurso = $sum1[9];
            $sum1[9] = $sum2[9];
            $sum2[9] = $transcurso;
        }





        ?>


        <form action="soluciones.php" method="post">
            <input type="hidden" name="regla" value="2">
            <div id="tabla">
                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[0] . "<br>-" . $sum2[0] . "<br>";
                    ?>
                    <input type="hidden" name="operador_0_1" value="<?php echo $sum1[0]; ?>">
                    <input type="hidden" name="operador_0_2" value="<?php echo $sum2[0]; ?>">
                    <input type="number" name="res0" placeholder="resultado">

                </section>


                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[1] . "<br>-" . $sum2[1] . "<br>";
                    ?>
                    <input type="hidden" name="operador_1_1" value="<?php echo $sum1[1]; ?>">
                    <input type="hidden" name="operador_1_2" value="<?php echo $sum2[1]; ?>">
                    <input type="number" name="res1" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[2] . "<br>-" . $sum2[2] . "<br>";
                    ?>
                    <input type="hidden" name="operador_2_1" value="<?php echo $sum1[2]; ?>">
                    <input type="hidden" name="operador_2_2" value="<?php echo $sum2[2]; ?>">
                    <input type="number" name="res2" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[3] . "<br>-" . $sum2[3] . "<br>";
                    ?>
                    <input type="hidden" name="operador_3_1" value="<?php echo $sum1[3]; ?>">
                    <input type="hidden" name="operador_3_2" value="<?php echo $sum2[3]; ?>">
                    <input type="number" name="res3" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[4] . "<br>-" . $sum2[4] . "<br>";
                    ?>
                    <input type="hidden" name="operador_4_1" value="<?php echo $sum1[4]; ?>">
                    <input type="hidden" name="operador_4_2" value="<?php echo $sum2[4]; ?>">
                    <input type="number" name="res4" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[5] . "<br>-" . $sum2[5] . "<br>";
                    ?>
                    <input type="hidden" name="operador_5_1" value="<?php echo $sum1[5]; ?>">
                    <input type="hidden" name="operador_5_2" value="<?php echo $sum2[5]; ?>">
                    <input type="number" name="res5" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[6] . "<br>-" . $sum2[6] . "<br>";
                    ?>
                    <input type="hidden" name="operador_6_1" value="<?php echo $sum1[6]; ?>">
                    <input type="hidden" name="operador_6_2" value="<?php echo $sum2[6]; ?>">
                    <input type="number" name="res6" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[7] . "<br>-" . $sum2[7] . "<br>";
                    ?>
                    <input type="hidden" name="operador_7_1" value="<?php echo $sum1[7]; ?>">
                    <input type="hidden" name="operador_7_2" value="<?php echo $sum2[7]; ?>">
                    <input type="number" name="res7" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[8] . "<br>-" . $sum2[8] . "<br>";
                    ?>
                    <input type="hidden" name="operador_8_1" value="<?php echo $sum1[8]; ?>">
                    <input type="hidden" name="operador_8_2" value="<?php echo $sum2[8]; ?>">
                    <input type="number" name="res8" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[9] . "<br>-" . $sum2[9] . "<br>";
                    ?>
                    <input type="hidden" name="operador_9_1" value="<?php echo $sum1[9]; ?>">
                    <input type="hidden" name="operador_9_2" value="<?php echo $sum2[9]; ?>">
                    <input type="number" name="res9" placeholder="resultado">

                </section>
            </div>

            <input type="submit" value="Corregir">

        </form>

    <?php
        $res[0] = $_POST['res0'];
        $res[1] = $_POST['res1'];
        $res[2] = $_POST['res2'];
        $res[3] = $_POST['res3'];
        $res[4] = $_POST['res4'];
        $res[5] = $_POST['res5'];
        $res[6] = $_POST['res6'];
        $res[7] = $_POST['res7'];
        $res[8] = $_POST['res8'];
        $res[9] = $_POST['res9'];
    }
    ?>


    <?php
    if ($regla == 1) {
    ?>

        <?php
        $sum1[0] = rand($lim1, $lim2);
        $sum1[1] = rand($lim1, $lim2);
        $sum1[2] = rand($lim1, $lim2);
        $sum1[3] = rand($lim1, $lim2);
        $sum1[4] = rand($lim1, $lim2);
        $sum1[5] = rand($lim1, $lim2);
        $sum1[6] = rand($lim1, $lim2);
        $sum1[7] = rand($lim1, $lim2);
        $sum1[8] = rand($lim1, $lim2);
        $sum1[9] = rand($lim1, $lim2);

        $sum2[0] = rand($lim1, $lim2);
        $sum2[1] = rand($lim1, $lim2);
        $sum2[2] = rand($lim1, $lim2);
        $sum2[3] = rand($lim1, $lim2);
        $sum2[4] = rand($lim1, $lim2);
        $sum2[5] = rand($lim1, $lim2);
        $sum2[6] = rand($lim1, $lim2);
        $sum2[7] = rand($lim1, $lim2);
        $sum2[8] = rand($lim1, $lim2);
        $sum2[9] = rand($lim1, $lim2);


        ?>


        <form action="soluciones.php" method="post">

            <div id="tabla">
                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[0] . "<br>+" . $sum2[0] . "<br>";
                    ?>
                    <input type="hidden" name="operador_0_1" value="<?php echo $sum1[0]; ?>">
                    <input type="hidden" name="operador_0_2" value="<?php echo $sum2[0]; ?>">
                    <input type="number" name="res0" placeholder="resultado">

                </section>


                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[1] . "<br>+" . $sum2[1] . "<br>";
                    ?>
                    <input type="hidden" name="operador_1_1" value="<?php echo $sum1[1]; ?>">
                    <input type="hidden" name="operador_1_2" value="<?php echo $sum2[1]; ?>">
                    <input type="number" name="res1" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[2] . "<br>+" . $sum2[2] . "<br>";
                    ?>
                    <input type="hidden" name="operador_2_1" value="<?php echo $sum1[2]; ?>">
                    <input type="hidden" name="operador_2_2" value="<?php echo $sum2[2]; ?>">
                    <input type="number" name="res2" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[3] . "<br>+" . $sum2[3] . "<br>";
                    ?>
                    <input type="hidden" name="operador_3_1" value="<?php echo $sum1[3]; ?>">
                    <input type="hidden" name="operador_3_2" value="<?php echo $sum2[3]; ?>">
                    <input type="number" name="res3" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[4] . "<br>+" . $sum2[4] . "<br>";
                    ?>
                    <input type="hidden" name="operador_4_1" value="<?php echo $sum1[4]; ?>">
                    <input type="hidden" name="operador_4_2" value="<?php echo $sum2[4]; ?>">
                    <input type="number" name="res4" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[5] . "<br>+" . $sum2[5] . "<br>";
                    ?>
                    <input type="hidden" name="operador_5_1" value="<?php echo $sum1[5]; ?>">
                    <input type="hidden" name="operador_5_2" value="<?php echo $sum2[5]; ?>">
                    <input type="number" name="res5" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[6] . "<br>+" . $sum2[6] . "<br>";
                    ?>
                    <input type="hidden" name="operador_6_1" value="<?php echo $sum1[6]; ?>">
                    <input type="hidden" name="operador_6_2" value="<?php echo $sum2[6]; ?>">
                    <input type="number" name="res6" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[7] . "<br>+" . $sum2[7] . "<br>";
                    ?>
                    <input type="hidden" name="operador_7_1" value="<?php echo $sum1[7]; ?>">
                    <input type="hidden" name="operador_7_2" value="<?php echo $sum2[7]; ?>">
                    <input type="number" name="res7" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[8] . "<br>+" . $sum2[8] . "<br>";
                    ?>
                    <input type="hidden" name="operador_8_1" value="<?php echo $sum1[8]; ?>">
                    <input type="hidden" name="operador_8_2" value="<?php echo $sum2[8]; ?>">
                    <input type="number" name="res8" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[9] . "<br>+" . $sum2[9] . "<br>";
                    ?>
                    <input type="hidden" name="operador_9_1" value="<?php echo $sum1[9]; ?>">
                    <input type="hidden" name="operador_9_2" value="<?php echo $sum2[9]; ?>">
                    <input type="number" name="res9" placeholder="resultado">

                </section>
            </div>

            <input type="submit" value="Corregir">

        </form>

    <?php
        $res[0] = $_POST['res0'];
        $res[1] = $_POST['res1'];
        $res[2] = $_POST['res2'];
        $res[3] = $_POST['res3'];
        $res[4] = $_POST['res4'];
        $res[5] = $_POST['res5'];
        $res[6] = $_POST['res6'];
        $res[7] = $_POST['res7'];
        $res[8] = $_POST['res8'];
        $res[9] = $_POST['res9'];
    }
    ?>


    <?php
    if ($regla == 1) {
    ?>

        <?php
        $sum1[0] = rand($lim1, $lim2);
        $sum1[1] = rand($lim1, $lim2);
        $sum1[2] = rand($lim1, $lim2);
        $sum1[3] = rand($lim1, $lim2);
        $sum1[4] = rand($lim1, $lim2);
        $sum1[5] = rand($lim1, $lim2);
        $sum1[6] = rand($lim1, $lim2);
        $sum1[7] = rand($lim1, $lim2);
        $sum1[8] = rand($lim1, $lim2);
        $sum1[9] = rand($lim1, $lim2);

        $sum2[0] = rand($lim1, $lim2);
        $sum2[1] = rand($lim1, $lim2);
        $sum2[2] = rand($lim1, $lim2);
        $sum2[3] = rand($lim1, $lim2);
        $sum2[4] = rand($lim1, $lim2);
        $sum2[5] = rand($lim1, $lim2);
        $sum2[6] = rand($lim1, $lim2);
        $sum2[7] = rand($lim1, $lim2);
        $sum2[8] = rand($lim1, $lim2);
        $sum2[9] = rand($lim1, $lim2);


        ?>


        <form action="soluciones.php" method="post">

            <div id="tabla">
                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[0] . "<br>+" . $sum2[0] . "<br>";
                    ?>
                    <input type="hidden" name="operador_0_1" value="<?php echo $sum1[0]; ?>">
                    <input type="hidden" name="operador_0_2" value="<?php echo $sum2[0]; ?>">
                    <input type="number" name="res0" placeholder="resultado">

                </section>


                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[1] . "<br>+" . $sum2[1] . "<br>";
                    ?>
                    <input type="hidden" name="operador_1_1" value="<?php echo $sum1[1]; ?>">
                    <input type="hidden" name="operador_1_2" value="<?php echo $sum2[1]; ?>">
                    <input type="number" name="res1" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[2] . "<br>+" . $sum2[2] . "<br>";
                    ?>
                    <input type="hidden" name="operador_2_1" value="<?php echo $sum1[2]; ?>">
                    <input type="hidden" name="operador_2_2" value="<?php echo $sum2[2]; ?>">
                    <input type="number" name="res2" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[3] . "<br>+" . $sum2[3] . "<br>";
                    ?>
                    <input type="hidden" name="operador_3_1" value="<?php echo $sum1[3]; ?>">
                    <input type="hidden" name="operador_3_2" value="<?php echo $sum2[3]; ?>">
                    <input type="number" name="res3" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[4] . "<br>+" . $sum2[4] . "<br>";
                    ?>
                    <input type="hidden" name="operador_4_1" value="<?php echo $sum1[4]; ?>">
                    <input type="hidden" name="operador_4_2" value="<?php echo $sum2[4]; ?>">
                    <input type="number" name="res4" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[5] . "<br>+" . $sum2[5] . "<br>";
                    ?>
                    <input type="hidden" name="operador_5_1" value="<?php echo $sum1[5]; ?>">
                    <input type="hidden" name="operador_5_2" value="<?php echo $sum2[5]; ?>">
                    <input type="number" name="res5" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[6] . "<br>+" . $sum2[6] . "<br>";
                    ?>
                    <input type="hidden" name="operador_6_1" value="<?php echo $sum1[6]; ?>">
                    <input type="hidden" name="operador_6_2" value="<?php echo $sum2[6]; ?>">
                    <input type="number" name="res6" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[7] . "<br>+" . $sum2[7] . "<br>";
                    ?>
                    <input type="hidden" name="operador_7_1" value="<?php echo $sum1[7]; ?>">
                    <input type="hidden" name="operador_7_2" value="<?php echo $sum2[7]; ?>">
                    <input type="number" name="res7" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[8] . "<br>+" . $sum2[8] . "<br>";
                    ?>
                    <input type="hidden" name="operador_8_1" value="<?php echo $sum1[8]; ?>">
                    <input type="hidden" name="operador_8_2" value="<?php echo $sum2[8]; ?>">
                    <input type="number" name="res8" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[9] . "<br>+" . $sum2[9] . "<br>";
                    ?>
                    <input type="hidden" name="operador_9_1" value="<?php echo $sum1[9]; ?>">
                    <input type="hidden" name="operador_9_2" value="<?php echo $sum2[9]; ?>">
                    <input type="number" name="res9" placeholder="resultado">

                </section>
            </div>

            <input type="submit" value="Corregir">

        </form>

    <?php
        $res[0] = $_POST['res0'];
        $res[1] = $_POST['res1'];
        $res[2] = $_POST['res2'];
        $res[3] = $_POST['res3'];
        $res[4] = $_POST['res4'];
        $res[5] = $_POST['res5'];
        $res[6] = $_POST['res6'];
        $res[7] = $_POST['res7'];
        $res[8] = $_POST['res8'];
        $res[9] = $_POST['res9'];
    }
    ?>

    <?php
    if ($regla == 3) {
    ?>

        <?php
        $sum1[0] = rand($lim1, $lim2);
        $sum1[1] = rand($lim1, $lim2);
        $sum1[2] = rand($lim1, $lim2);
        $sum1[3] = rand($lim1, $lim2);
        $sum1[4] = rand($lim1, $lim2);
        $sum1[5] = rand($lim1, $lim2);
        $sum1[6] = rand($lim1, $lim2);
        $sum1[7] = rand($lim1, $lim2);
        $sum1[8] = rand($lim1, $lim2);
        $sum1[9] = rand($lim1, $lim2);

        $sum2[0] = rand($lim1, $lim2);
        $sum2[1] = rand($lim1, $lim2);
        $sum2[2] = rand($lim1, $lim2);
        $sum2[3] = rand($lim1, $lim2);
        $sum2[4] = rand($lim1, $lim2);
        $sum2[5] = rand($lim1, $lim2);
        $sum2[6] = rand($lim1, $lim2);
        $sum2[7] = rand($lim1, $lim2);
        $sum2[8] = rand($lim1, $lim2);
        $sum2[9] = rand($lim1, $lim2);


        ?>


        <form action="soluciones.php" method="post">
            <input type="hidden" name="regla" value="3">
            <div id="tabla">
                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[0] . "<br>*" . $sum2[0] . "<br>";
                    ?>
                    <input type="hidden" name="operador_0_1" value="<?php echo $sum1[0]; ?>">
                    <input type="hidden" name="operador_0_2" value="<?php echo $sum2[0]; ?>">
                    <input type="number" name="res0" placeholder="resultado">

                </section>


                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[1] . "<br>*" . $sum2[1] . "<br>";
                    ?>
                    <input type="hidden" name="operador_1_1" value="<?php echo $sum1[1]; ?>">
                    <input type="hidden" name="operador_1_2" value="<?php echo $sum2[1]; ?>">
                    <input type="number" name="res1" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[2] . "<br>*" . $sum2[2] . "<br>";
                    ?>
                    <input type="hidden" name="operador_2_1" value="<?php echo $sum1[2]; ?>">
                    <input type="hidden" name="operador_2_2" value="<?php echo $sum2[2]; ?>">
                    <input type="number" name="res2" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[3] . "<br>*" . $sum2[3] . "<br>";
                    ?>
                    <input type="hidden" name="operador_3_1" value="<?php echo $sum1[3]; ?>">
                    <input type="hidden" name="operador_3_2" value="<?php echo $sum2[3]; ?>">
                    <input type="number" name="res3" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[4] . "<br>*" . $sum2[4] . "<br>";
                    ?>
                    <input type="hidden" name="operador_4_1" value="<?php echo $sum1[4]; ?>">
                    <input type="hidden" name="operador_4_2" value="<?php echo $sum2[4]; ?>">
                    <input type="number" name="res4" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[5] . "<br>*" . $sum2[5] . "<br>";
                    ?>
                    <input type="hidden" name="operador_5_1" value="<?php echo $sum1[5]; ?>">
                    <input type="hidden" name="operador_5_2" value="<?php echo $sum2[5]; ?>">
                    <input type="number" name="res5" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[6] . "<br>*" . $sum2[6] . "<br>";
                    ?>
                    <input type="hidden" name="operador_6_1" value="<?php echo $sum1[6]; ?>">
                    <input type="hidden" name="operador_6_2" value="<?php echo $sum2[6]; ?>">
                    <input type="number" name="res6" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[7] . "<br>*" . $sum2[7] . "<br>";
                    ?>
                    <input type="hidden" name="operador_7_1" value="<?php echo $sum1[7]; ?>">
                    <input type="hidden" name="operador_7_2" value="<?php echo $sum2[7]; ?>">
                    <input type="number" name="res7" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[8] . "<br>*" . $sum2[8] . "<br>";
                    ?>
                    <input type="hidden" name="operador_8_1" value="<?php echo $sum1[8]; ?>">
                    <input type="hidden" name="operador_8_2" value="<?php echo $sum2[8]; ?>">
                    <input type="number" name="res8" placeholder="resultado">

                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[9] . "<br>*" . $sum2[9] . "<br>";
                    ?>
                    <input type="hidden" name="operador_9_1" value="<?php echo $sum1[9]; ?>">
                    <input type="hidden" name="operador_9_2" value="<?php echo $sum2[9]; ?>">
                    <input type="number" name="res9" placeholder="resultado">

                </section>
            </div>

            <input type="submit" value="Corregir">

        </form>

    <?php
        $res[0] = $_POST['res0'];
        $res[1] = $_POST['res1'];
        $res[2] = $_POST['res2'];
        $res[3] = $_POST['res3'];
        $res[4] = $_POST['res4'];
        $res[5] = $_POST['res5'];
        $res[6] = $_POST['res6'];
        $res[7] = $_POST['res7'];
        $res[8] = $_POST['res8'];
        $res[9] = $_POST['res9'];
    }
    ?>


    <?php
    if ($regla == 4) {
    ?>

        <?php
        $sum1[0] = rand($lim1, $lim2);
        $sum1[1] = rand($lim1, $lim2);
        $sum1[2] = rand($lim1, $lim2);
        $sum1[3] = rand($lim1, $lim2);
        $sum1[4] = rand($lim1, $lim2);
        $sum1[5] = rand($lim1, $lim2);
        $sum1[6] = rand($lim1, $lim2);
        $sum1[7] = rand($lim1, $lim2);
        $sum1[8] = rand($lim1, $lim2);
        $sum1[9] = rand($lim1, $lim2);

        $sum2[0] = rand($lim1, $lim2);
        $sum2[1] = rand($lim1, $lim2);
        $sum2[2] = rand($lim1, $lim2);
        $sum2[3] = rand($lim1, $lim2);
        $sum2[4] = rand($lim1, $lim2);
        $sum2[5] = rand($lim1, $lim2);
        $sum2[6] = rand($lim1, $lim2);
        $sum2[7] = rand($lim1, $lim2);
        $sum2[8] = rand($lim1, $lim2);
        $sum2[9] = rand($lim1, $lim2);


        ?>


        <form action="soluciones.php" method="post">
            <input type="hidden" name="regla" value="4">
            <div id="tabla">
                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[0] . "<br>:" . $sum2[0] . "<br>";
                    ?>
                    <input type="hidden" name="operador_0_1" value="<?php echo $sum1[0]; ?>">
                    <input type="hidden" name="operador_0_2" value="<?php echo $sum2[0]; ?>">
                    <input type="number" name="res0" placeholder="cociente">
                    <br>
                    <input type="number" name="modulo0" placeholder="resto">
                </section>


                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[1] . "<br>:" . $sum2[1] . "<br>";
                    ?>
                    <input type="hidden" name="operador_1_1" value="<?php echo $sum1[1]; ?>">
                    <input type="hidden" name="operador_1_2" value="<?php echo $sum2[1]; ?>">
                    <input type="number" name="res1" placeholder="cociente">
                    <br>
                    <input type="number" name="modulo1" placeholder="resto">
                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[2] . "<br>:" . $sum2[2] . "<br>";
                    ?>
                    <input type="hidden" name="operador_2_1" value="<?php echo $sum1[2]; ?>">
                    <input type="hidden" name="operador_2_2" value="<?php echo $sum2[2]; ?>">
                    <input type="number" name="res2" placeholder="cociente">
                    <br>
                    <input type="number" name="modulo2" placeholder="resto">
                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[3] . "<br>:" . $sum2[3] . "<br>";
                    ?>
                    <input type="hidden" name="operador_3_1" value="<?php echo $sum1[3]; ?>">
                    <input type="hidden" name="operador_3_2" value="<?php echo $sum2[3]; ?>">
                    <input type="number" name="res3" placeholder="cociente">
                    <br>
                    <input type="number" name="modulo3" placeholder="resto">
                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[4] . "<br>:" . $sum2[4] . "<br>";
                    ?>
                    <input type="hidden" name="operador_4_1" value="<?php echo $sum1[4]; ?>">
                    <input type="hidden" name="operador_4_2" value="<?php echo $sum2[4]; ?>">
                    <input type="number" name="res4" placeholder="cociente">
                    <br>
                    <input type="number" name="modulo4" placeholder="resto">
                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[5] . "<br>:" . $sum2[5] . "<br>";
                    ?>
                    <input type="hidden" name="operador_5_1" value="<?php echo $sum1[5]; ?>">
                    <input type="hidden" name="operador_5_2" value="<?php echo $sum2[5]; ?>">
                    <input type="number" name="res5" placeholder="cociente">
                    <br>
                    <input type="number" name="modulo5" placeholder="resto">
                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[6] . "<br>:" . $sum2[6] . "<br>";
                    ?>
                    <input type="hidden" name="operador_6_1" value="<?php echo $sum1[6]; ?>">
                    <input type="hidden" name="operador_6_2" value="<?php echo $sum2[6]; ?>">
                    <input type="number" name="res6" placeholder="cociente">
                    <br>
                    <input type="number" name="modulo6" placeholder="resto">
                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[7] . "<br>:" . $sum2[7] . "<br>";
                    ?>
                    <input type="hidden" name="operador_7_1" value="<?php echo $sum1[7]; ?>">
                    <input type="hidden" name="operador_7_2" value="<?php echo $sum2[7]; ?>">
                    <input type="number" name="res7" placeholder="cociente">
                    <br>
                    <input type="number" name="modulo7" placeholder="resto">
                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[8] . "<br>:" . $sum2[8] . "<br>";
                    ?>
                    <input type="hidden" name="operador_8_1" value="<?php echo $sum1[8]; ?>">
                    <input type="hidden" name="operador_8_2" value="<?php echo $sum2[8]; ?>">
                    <input type="number" name="res8" placeholder="cociente">
                    <br>
                    <input type="number" name="modulo8" placeholder="resto">
                </section>

                <section class="suma">

                    <?php
                    echo "&nbsp;" . $sum1[9] . "<br>:" . $sum2[9] . "<br>";
                    ?>
                    <input type="hidden" name="operador_9_1" value="<?php echo $sum1[9]; ?>">
                    <input type="hidden" name="operador_9_2" value="<?php echo $sum2[9]; ?>">
                    <input type="number" name="res9" placeholder="cociente">
                    <br>
                    <input type="number" name="modulo9" placeholder="resto">
                </section>
            </div>

            <input type="submit" value="Corregir">

        </form>

    <?php
        $res[0] = $_POST['res0'];
        $res[1] = $_POST['res1'];
        $res[2] = $_POST['res2'];
        $res[3] = $_POST['res3'];
        $res[4] = $_POST['res4'];
        $res[5] = $_POST['res5'];
        $res[6] = $_POST['res6'];
        $res[7] = $_POST['res7'];
        $res[8] = $_POST['res8'];
        $res[9] = $_POST['res9'];
    }
    ?>





</body>

</html>


EL SOLUCIONES:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Cuaderno Rubio</title>
    <link rel="stylesheet" href="style.css">




</head>

<body>

    <header>
        <div>

            <h2> Escoge la operación a procesar </h2>
            <ol>

                <li> Sumas </li>
                <li> Restas </li>
                <li> Multiplicaciones </li>
                <li> Divisiones enteras </li>
            </ol>

            <form action="index.php" method="post">

                <input type="number" name="regla" min=1 max=4 step=1>
                <input type="submit" value="Enviar">

            </form>

            <?php
            $regla = $_POST['regla'];
            ?>

        </div>


        <div>

            <h2> Escoge el nivel de dificultad </h2>
            <ol>

                <li> Fácil </li>
                <li> Normal </li>
                <li> Complicado </li>
            </ol>

            <form action="index.php" method="post">

                <input type="number" name="dificultad" min=1 max=3 step=1>
                <input type="submit" value="Enviar">

            </form>

            <?php

            if ($_POST['dificultad'] == 1) {
                $lim1 = "1";
                $lim2 = "9";
            } elseif ($_POST['dificultad'] == 2) {
                $lim1 = "10";
                $lim2 = "99";
            } else {
                $lim1 = "100";
                $lim2 = "999";
            }

            ?>

        </div>
    </header>


    <?php
    if ($_POST['regla'] == 1) {
    ?>


        <?php


        $sum1[0] = $_POST['operador_0_1'];
        $sum1[1] = $_POST['operador_1_1'];
        $sum1[2] = $_POST['operador_2_1'];
        $sum1[3] = $_POST['operador_3_1'];
        $sum1[4] = $_POST['operador_4_1'];
        $sum1[5] = $_POST['operador_5_1'];
        $sum1[6] = $_POST['operador_6_1'];
        $sum1[7] = $_POST['operador_7_1'];
        $sum1[8] = $_POST['operador_8_1'];
        $sum1[9] = $_POST['operador_9_1'];

        $sum2[0] = $_POST['operador_0_2'];
        $sum2[1] = $_POST['operador_1_2'];
        $sum2[2] = $_POST['operador_2_2'];
        $sum2[3] = $_POST['operador_3_2'];
        $sum2[4] = $_POST['operador_4_2'];
        $sum2[5] = $_POST['operador_5_2'];
        $sum2[6] = $_POST['operador_6_2'];
        $sum2[7] = $_POST['operador_7_2'];
        $sum2[8] = $_POST['operador_8_2'];
        $sum2[9] = $_POST['operador_9_2'];

        $res[0] = $_POST['res0'];
        $res[1] = $_POST['res1'];
        $res[2] = $_POST['res2'];
        $res[3] = $_POST['res3'];
        $res[4] = $_POST['res4'];
        $res[5] = $_POST['res5'];
        $res[6] = $_POST['res6'];
        $res[7] = $_POST['res7'];
        $res[8] = $_POST['res8'];
        $res[9] = $_POST['res9'];
        ?>




        <?php
        $class = "ok";
        ?>

        <form action="soluciones.php" method="post">
            <div id="tabla">


                <?php
                if (($sum1[0] + $sum2[0]) <> $res[0]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[0] . "<br>+" . $sum2[0] . "<br>" . $res[0];
                    ?>

                </section>


                <?php
                if (($sum1[1] + $sum2[1]) <> $res[1]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[1] . "<br>+" . $sum2[1] . "<br>" . $res[1];
                    ?>

                </section>

                <?php
                if (($sum1[2] + $sum2[2]) <> $res[2]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[2] . "<br>+" . $sum2[2] . "<br>" . $res[2];
                    ?>

                </section>

                <?php
                if (($sum1[3] + $sum2[3]) <> $res[3]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[3] . "<br>+" . $sum2[3] . "<br>" . $res[3];
                    ?>

                </section>

                <?php
                if (($sum1[4] + $sum2[4]) <> $res[4]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[4] . "<br>+" . $sum2[4] . "<br>" . $res[4];
                    ?>

                </section>

                <?php
                if (($sum1[5] + $sum2[5]) <> $res[5]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[5] . "<br>+" . $sum2[5] . "<br>" . $res[5];
                    ?>

                </section>

                <?php
                if (($sum1[6] + $sum2[6]) <> $res[6]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[6] . "<br>+" . $sum2[6] . "<br>" . $res[6];
                    ?>

                </section>

                <?php
                if (($sum1[7] + $sum2[7]) <> $res[7]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[7] . "<br>+" . $sum2[7] . "<br>" . $res[7];
                    ?>

                </section>

                <?php
                if (($sum1[8] + $sum2[8]) <> $res[8]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[8] . "<br>+" . $sum2[8] . "<br>" . $res[8];
                    ?>

                </section>

                <?php
                if (($sum1[9] + $sum2[9]) <> $res[9]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[9] . "<br>+" . $sum2[9] . "<br>" . $res[9];
                    ?>

                </section>
            </div>
        </form>

    <?php } ?>


    <?php
    if ($_POST['regla'] == 2) {
    ?>


        <?php


        $sum1[0] = $_POST['operador_0_1'];
        $sum1[1] = $_POST['operador_1_1'];
        $sum1[2] = $_POST['operador_2_1'];
        $sum1[3] = $_POST['operador_3_1'];
        $sum1[4] = $_POST['operador_4_1'];
        $sum1[5] = $_POST['operador_5_1'];
        $sum1[6] = $_POST['operador_6_1'];
        $sum1[7] = $_POST['operador_7_1'];
        $sum1[8] = $_POST['operador_8_1'];
        $sum1[9] = $_POST['operador_9_1'];

        $sum2[0] = $_POST['operador_0_2'];
        $sum2[1] = $_POST['operador_1_2'];
        $sum2[2] = $_POST['operador_2_2'];
        $sum2[3] = $_POST['operador_3_2'];
        $sum2[4] = $_POST['operador_4_2'];
        $sum2[5] = $_POST['operador_5_2'];
        $sum2[6] = $_POST['operador_6_2'];
        $sum2[7] = $_POST['operador_7_2'];
        $sum2[8] = $_POST['operador_8_2'];
        $sum2[9] = $_POST['operador_9_2'];

        $res[0] = $_POST['res0'];
        $res[1] = $_POST['res1'];
        $res[2] = $_POST['res2'];
        $res[3] = $_POST['res3'];
        $res[4] = $_POST['res4'];
        $res[5] = $_POST['res5'];
        $res[6] = $_POST['res6'];
        $res[7] = $_POST['res7'];
        $res[8] = $_POST['res8'];
        $res[9] = $_POST['res9'];
        ?>




        <?php
        $class = "ok";
        ?>

        <form action="soluciones.php" method="post">
            <div id="tabla">


                <?php
                if (($sum1[0] - $sum2[0]) <> $res[0]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[0] . "<br>-" . $sum2[0] . "<br>" . $res[0];
                    ?>

                </section>


                <?php
                if (($sum1[1] - $sum2[1]) <> $res[1]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[1] . "<br>-" . $sum2[1] . "<br>" . $res[1];
                    ?>

                </section>

                <?php
                if (($sum1[2] - $sum2[2]) <> $res[2]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[2] . "<br>-" . $sum2[2] . "<br>" . $res[2];
                    ?>

                </section>

                <?php
                if (($sum1[3] - $sum2[3]) <> $res[3]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[3] . "<br>-" . $sum2[3] . "<br>" . $res[3];
                    ?>

                </section>

                <?php
                if (($sum1[4] - $sum2[4]) <> $res[4]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[4] . "<br>-" . $sum2[4] . "<br>" . $res[4];
                    ?>

                </section>

                <?php
                if (($sum1[5] - $sum2[5]) <> $res[5]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[5] . "<br>-" . $sum2[5] . "<br>" . $res[5];
                    ?>

                </section>

                <?php
                if (($sum1[6] - $sum2[6]) <> $res[6]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[6] . "<br>-" . $sum2[6] . "<br>" . $res[6];
                    ?>

                </section>

                <?php
                if (($sum1[7] - $sum2[7]) <> $res[7]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[7] . "<br>-" . $sum2[7] . "<br>" . $res[7];
                    ?>

                </section>

                <?php
                if (($sum1[8] - $sum2[8]) <> $res[8]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[8] . "<br>-" . $sum2[8] . "<br>" . $res[8];
                    ?>

                </section>

                <?php
                if (($sum1[9] - $sum2[9]) <> $res[9]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[9] . "<br>-" . $sum2[9] . "<br>" . $res[9];
                    ?>

                </section>
            </div>
        </form>

    <?php } ?>


    <?php
    if ($_POST['regla'] == 3) {
    ?>


        <?php


        $sum1[0] = $_POST['operador_0_1'];
        $sum1[1] = $_POST['operador_1_1'];
        $sum1[2] = $_POST['operador_2_1'];
        $sum1[3] = $_POST['operador_3_1'];
        $sum1[4] = $_POST['operador_4_1'];
        $sum1[5] = $_POST['operador_5_1'];
        $sum1[6] = $_POST['operador_6_1'];
        $sum1[7] = $_POST['operador_7_1'];
        $sum1[8] = $_POST['operador_8_1'];
        $sum1[9] = $_POST['operador_9_1'];

        $sum2[0] = $_POST['operador_0_2'];
        $sum2[1] = $_POST['operador_1_2'];
        $sum2[2] = $_POST['operador_2_2'];
        $sum2[3] = $_POST['operador_3_2'];
        $sum2[4] = $_POST['operador_4_2'];
        $sum2[5] = $_POST['operador_5_2'];
        $sum2[6] = $_POST['operador_6_2'];
        $sum2[7] = $_POST['operador_7_2'];
        $sum2[8] = $_POST['operador_8_2'];
        $sum2[9] = $_POST['operador_9_2'];

        $res[0] = $_POST['res0'];
        $res[1] = $_POST['res1'];
        $res[2] = $_POST['res2'];
        $res[3] = $_POST['res3'];
        $res[4] = $_POST['res4'];
        $res[5] = $_POST['res5'];
        $res[6] = $_POST['res6'];
        $res[7] = $_POST['res7'];
        $res[8] = $_POST['res8'];
        $res[9] = $_POST['res9'];
        ?>




        <?php
        $class = "ok";
        ?>

        <form action="soluciones.php" method="post">
            <div id="tabla">


                <?php
                if (($sum1[0] * $sum2[0]) <> $res[0]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[0] . "<br>*" . $sum2[0] . "<br>" . $res[0];
                    ?>

                </section>


                <?php
                if (($sum1[1] * $sum2[1]) <> $res[1]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[1] . "<br>*" . $sum2[1] . "<br>" . $res[1];
                    ?>

                </section>

                <?php
                if (($sum1[2] * $sum2[2]) <> $res[2]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[2] . "<br>*" . $sum2[2] . "<br>" . $res[2];
                    ?>

                </section>

                <?php
                if (($sum1[3] * $sum2[3]) <> $res[3]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[3] . "<br>*" . $sum2[3] . "<br>" . $res[3];
                    ?>

                </section>

                <?php
                if (($sum1[4] * $sum2[4]) <> $res[4]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[4] . "<br>*" . $sum2[4] . "<br>" . $res[4];
                    ?>

                </section>

                <?php
                if (($sum1[5] * $sum2[5]) <> $res[5]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[5] . "<br>*" . $sum2[5] . "<br>" . $res[5];
                    ?>

                </section>

                <?php
                if (($sum1[6] * $sum2[6]) <> $res[6]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[6] . "<br>*" . $sum2[6] . "<br>" . $res[6];
                    ?>

                </section>

                <?php
                if (($sum1[7] * $sum2[7]) <> $res[7]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[7] . "<br>*" . $sum2[7] . "<br>" . $res[7];
                    ?>

                </section>

                <?php
                if (($sum1[8] * $sum2[8]) <> $res[8]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[8] . "<br>*" . $sum2[8] . "<br>" . $res[8];
                    ?>

                </section>

                <?php
                if (($sum1[9] * $sum2[9]) <> $res[9]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[9] . "<br>*" . $sum2[9] . "<br>" . $res[9];
                    ?>

                </section>
            </div>
        </form>

    <?php } ?>




    <?php
    if ($_POST['regla'] == 4) {
    ?>


        <?php


        $sum1[0] = $_POST['operador_0_1'];
        $sum1[1] = $_POST['operador_1_1'];
        $sum1[2] = $_POST['operador_2_1'];
        $sum1[3] = $_POST['operador_3_1'];
        $sum1[4] = $_POST['operador_4_1'];
        $sum1[5] = $_POST['operador_5_1'];
        $sum1[6] = $_POST['operador_6_1'];
        $sum1[7] = $_POST['operador_7_1'];
        $sum1[8] = $_POST['operador_8_1'];
        $sum1[9] = $_POST['operador_9_1'];

        $sum2[0] = $_POST['operador_0_2'];
        $sum2[1] = $_POST['operador_1_2'];
        $sum2[2] = $_POST['operador_2_2'];
        $sum2[3] = $_POST['operador_3_2'];
        $sum2[4] = $_POST['operador_4_2'];
        $sum2[5] = $_POST['operador_5_2'];
        $sum2[6] = $_POST['operador_6_2'];
        $sum2[7] = $_POST['operador_7_2'];
        $sum2[8] = $_POST['operador_8_2'];
        $sum2[9] = $_POST['operador_9_2'];

        $res[0] = $_POST['res0'];
        $res[1] = $_POST['res1'];
        $res[2] = $_POST['res2'];
        $res[3] = $_POST['res3'];
        $res[4] = $_POST['res4'];
        $res[5] = $_POST['res5'];
        $res[6] = $_POST['res6'];
        $res[7] = $_POST['res7'];
        $res[8] = $_POST['res8'];
        $res[9] = $_POST['res9'];

        $modulo[0] = $_POST['modulo0'];
        $modulo[1] = $_POST['modulo1'];
        $modulo[2] = $_POST['modulo2'];
        $modulo[3] = $_POST['modulo3'];
        $modulo[4] = $_POST['modulo4'];
        $modulo[5] = $_POST['modulo5'];
        $modulo[6] = $_POST['modulo6'];
        $modulo[7] = $_POST['modulo7'];
        $modulo[8] = $_POST['modulo8'];
        $modulo[9] = $_POST['modulo9'];


        ?>




        <?php
        $class = "ok";
        $classres = "ok";
        ?>

        <form action="soluciones.php" method="post">
            <div id="tabla">


                <?php
                if ((($sum1[0] - ($sum1[0] % $sum2[0])) / $sum2[0]) <> $res[0]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                if (($sum1[0] % $sum2[0]) <> $modulo[0]) {
                    $classres = "ko";
                } else {
                    $classres = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[0] . "<br>:" . $sum2[0] . "<br>" . $res[0];
                    ?>
                    <br><p class="<?php echo $classres; ?>">
                    <?php echo $modulo[0]."</p>"; ?>
                </section>


                <?php
                if ((($sum1[1] - ($sum1[1] % $sum2[1])) / $sum2[1]) <> $res[1]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                if (($sum1[1] % $sum2[1]) <> $modulo[1]) {
                    $classres = "ko";
                } else {
                    $classres = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[1] . "<br>:" . $sum2[1] . "<br>" . $res[1];
                    ?>
                    <br><p class="<?php echo $classres; ?>">
                    <?php echo $modulo[1]."</p>"; ?>

                </section>

                <?php
                if ((($sum1[2] - ($sum1[2] % $sum2[2])) / $sum2[2]) <> $res[2]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                if (($sum1[2] % $sum2[2]) <> $modulo[2]) {
                    $classres = "ko";
                } else {
                    $classres = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[2] . "<br>:" . $sum2[2] . "<br>" . $res[2];
                    ?>
                    <br><p class="<?php echo $classres; ?>">
                    <?php echo $modulo[2]."</p>"; ?>

                </section>

                <?php
                if ((($sum1[3] - ($sum1[3] % $sum2[3])) / $sum2[3]) <> $res[3]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                if (($sum1[3] % $sum2[3]) <> $modulo[3]) {
                    $classres = "ko";
                } else {
                    $classres = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[3] . "<br>:" . $sum2[3] . "<br>" . $res[3];
                    ?>
                    <br><p class="<?php echo $classres; ?>">
                    <?php echo $modulo[3]."</p>"; ?>

                </section>

                <?php
                if ((($sum1[4] - ($sum1[4] % $sum2[4])) / $sum2[4]) <> $res[4]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                if (($sum1[4] % $sum2[4]) <> $modulo[4]) {
                    $classres = "ko";
                } else {
                    $classres = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[4] . "<br>:" . $sum2[4] . "<br>" . $res[4];
                    ?>
                    <br><p class="<?php echo $classres; ?>">
                    <?php echo $modulo[4]."</p>"; ?>

                </section>

                <?php
                if ((($sum1[5] - ($sum1[5] % $sum2[5])) / $sum2[5]) <> $res[5]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                if (($sum1[5] % $sum2[5]) <> $modulo[5]) {
                    $classres = "ko";
                } else {
                    $classres = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[5] . "<br>:" . $sum2[5] . "<br>" . $res[5];
                    ?>
                    <br><p class="<?php echo $classres; ?>">
                    <?php echo $modulo[5]."</p>"; ?>

                </section>

                <?php
                if ((($sum1[6] - ($sum1[6] % $sum2[6])) / $sum2[6]) <> $res[6]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                if (($sum1[6] % $sum2[6]) <> $modulo[6]) {
                    $classres = "ko";
                } else {
                    $classres = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[6] . "<br>:" . $sum2[6] . "<br>" . $res[6];
                    ?>
                    <br><p class="<?php echo $classres; ?>">
                    <?php echo $modulo[6]."</p>"; ?>

                </section>

                <?php
                if ((($sum1[7] - ($sum1[7] % $sum2[7])) / $sum2[7]) <> $res[7]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                if (($sum1[7] % $sum2[7]) <> $modulo[7]) {
                    $classres = "ko";
                } else {
                    $classres = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[7] . "<br>:" . $sum2[7] . "<br>" . $res[7];
                    ?>
                    <br><p class="<?php echo $classres; ?>">
                    <?php echo $modulo[7]."</p>"; ?>

                </section>

                <?php
                if ((($sum1[8] - ($sum1[8] % $sum2[8])) / $sum2[8]) <> $res[8]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                if (($sum1[8] % $sum2[8]) <> $modulo[8]) {
                    $classres = "ko";
                } else {
                    $classres = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[8] . "<br>:" . $sum2[8] . "<br>" . $res[8];
                    ?>
                    <br><p class="<?php echo $classres; ?>">
                    <?php echo $modulo[8]."</p>"; ?>

                </section>

                <?php
                if ((($sum1[9] - ($sum1[9] % $sum2[9])) / $sum2[9]) <> $res[9]) {
                    $class = "ko";
                } else {
                    $class = "ok";
                }
                if (($sum1[9] % $sum2[9]) <> $modulo[9]) {
                    $classres = "ko";
                } else {
                    $classres = "ok";
                }
                ?>

                <section class="<?php echo $class; ?>">

                    <?php

                    echo "&nbsp;" . $sum1[9] . "<br>:" . $sum2[9] . "<br>" . $res[9];
                    ?>
                    <br><p class="<?php echo $classres; ?>">
                    <?php echo $modulo[9]."</p>"; ?>

                </section>
            </div>
        </form>

    <?php } ?>





</body>

</html>


EL STYLE:
* {
    box-sizing: border-box;

}

header {

    display: grid;
    grid-template-columns: 1fr 1fr;

}

#tabla {
    margin-top: 30px;
    display: grid;
    grid-template-columns: repeat(5, 1fr);
    margin-bottom: 30px;
}

.ok {
    background-color: green;
}

.ko {
    background-color: red;
}


Después le añado la responsividad, que me encaja en el poco tiempo de clase que queda ya:

* {
    box-sizing: border-box;

}

header {

    display: grid;
    grid-template-columns: 1fr 1fr;

}

#tabla {
    margin-top: 30px;
    display: grid;
    grid-template-columns: repeat(5, 1fr);
    margin-bottom: 30px;
}

.ok {
    background-color: green;
}

.ko {
    background-color: red;
}

@media (max-width: 500px){

header {

    grid-template-columns: 1fr;

}

#tabla {
    margin-top: 10px;
    grid-template-columns: 1fr;
    margin-bottom: 10px;
}

}


*** Día 28/11/2025

Cambia de 2 a 3 tras sincronizar, de lo último de aquí a lo último de allí


19: cambia el select por un input
25: include lo que hace es incluir el fichero en ese punto
28: podemos llevar la parte head sólo a este fichero

57: estando esto comprimido podemos seleccionar todo sólo marcando estas dos líneas, para copiar y pegar
67: otra vez empezamos con una operación, y ya pegaremos las demás
102 y 103: otro uso del round


EJERCICIO: cajero que dé la menor cantidad de billetes y monedas

La estructura 142 me da 141, creo que el procedimiento está bien pero me falta pasar de > a >=
He puesto lo de         $resto = $resto * 10; porque en https://www.php.net/manual/es/function.intdiv.php veo una estructura intdiv(int $num1, int $num2): int, y 0,50, 0,02... no son enteros

Acierto total y absoluto: 143 me lleva a 145
(Y además me alegra ver que un listado de if's no los comprueba todos y te saca sólo el último, veo que es como en Basic y te revisa TODOS los if's, en caso contrario no sé cómo los habría anidado o qué hubiera hecho... mejor y más lógico así)

164: qué sonido más chulo de videojuego tiene Debian cuando aquí sigues borrando el nombre y no hay más...


PROGRAMA SIN IMÁGENES:
<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="style.css">
</head>

<body>

    <header>

        <form action="index.php" method="post">
            <input type="number" name="importe" id="importe" min=0.01 step=0.01>
            <input type="submit" value="Enviar">
        </form>

        <?php
        $importe = $_POST['importe'];
        $resto = $importe;
        ?>


    </header>

    <main>

        <?php
        if ($resto >= 500) {
            $numero = intdiv($resto, 500);
            echo $numero . " billetes de 500 <br>";
            $resto = $resto - $numero * 500;
        }

        if ($resto >= 200) {
            $numero = intdiv($resto, 200);
            echo $numero . " billetes de 200 <br>";
            $resto = $resto - $numero * 200;
        }

        if ($resto >= 100) {
            $numero = intdiv($resto, 100);
            echo $numero . " billetes de 100 <br>";
            $resto = $resto - $numero * 100;
        }

        if ($resto >= 50) {
            $numero = intdiv($resto, 50);
            echo $numero . " billetes de 50 <br>";
            $resto = $resto - $numero * 50;
        }

        if ($resto >= 20) {
            $numero = intdiv($resto, 20);
            echo $numero . " billetes de 20 <br>";
            $resto = $resto - $numero * 20;
        }

        if ($resto >= 10) {
            $numero = intdiv($resto, 10);
            echo $numero . " billetes de 10 <br>";
            $resto = $resto - $numero * 10;
        }

        if ($resto >= 5) {
            $numero = intdiv($resto, 5);
            echo $numero . " billetes de 5 <br>";
            $resto = $resto - $numero * 5;
        }

        if ($resto >= 2) {
            $numero = intdiv($resto, 2);
            echo $numero . " monedas de 2 <br>";
            $resto = $resto - $numero * 2;
        }

        if ($resto >= 1) {
            $numero = intdiv($resto, 1);
            echo $numero . " monedas de 1 <br>";
            $resto = $resto - $numero * 1;
        }

        $resto = $resto * 10;

        if ($resto >= 5) {
            $numero = intdiv($resto, 5);
            echo $numero . " monedas de 0,50 <br>";
            $resto = $resto - $numero * 5;
        }

        if ($resto >= 2) {
            $numero = intdiv($resto, 2);
            echo $numero . " monedas de 0,20 <br>";
            $resto = $resto - $numero * 2;
        }

        if ($resto >= 1) {
            $numero = intdiv($resto, 1);
            echo $numero . " monedas de 0,10 <br>";
            $resto = $resto - $numero * 1;
        }

        $resto = $resto * 10;

        if ($resto >= 5) {
            $numero = intdiv($resto, 5);
            echo $numero . " monedas de 0,05 <br>";
            $resto = $resto - $numero * 5;
        }

        if ($resto >= 2) {
            $numero = intdiv($resto, 2);
            echo $numero . " monedas de 0,02 <br>";
            $resto = $resto - $numero * 2;
        }

        if ($resto > 0) {

            echo $resto . " monedas de 0,01";
        }


        ?>




    </main>




</body>

</html>


Buscando "php mostrar imágenes con echo" encuentro esto:

<?php
// Ruta de la imagen
$rutaImagen = "ruta/a/tu/imagen.jpg";

// Mostrar la imagen con echo
echo '<img src="' . $rutaImagen . '" alt="Descripción de la imagen">';
?>

Tenía el fallo en que no son comillas dobles como en <br>, sino comillas simples
… y efectivamente, con eso llego a 266 y 267

268, 269: maldita sea, la liamos con el <h3>, entiendo que lo lleva como título... a ponerlo como <p> con un font-size grande en el CSS
282 a 284: pues nada, que no rompemos el efecto...
286 y 285: resuelto con display: inline en el CSS

287: no entiendo por qué se ha cambiado sola la dimensión de la ventana en mi ausencia...
289 y 290: ese resto final con un importe 258,36... no lo entiendo (se supone que trabajo con valores enteros), pero lo resolveríamos con round o con algo similar al int de Basic. O con algo similar al if de 0,02.
... pero no lo entiendo, a ver si al reiniciar el navegador, por ejemplo


PROGRAMA:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Dar cambio</title>
    <link rel="stylesheet" href="style.css">
</head>

<body>

    <header>

        <form action="index.php" method="post">
            <input type="number" name="importe" id="importe" min=0.01 step=0.01>
            <input type="submit" value="Enviar">
        </form>

        <?php
        $importe = $_POST['importe'];
        $resto = $importe;
        ?>


    </header>

    <main>

        <?php
        if ($resto >= 500) {
            $numero = intdiv($resto, 500);
            echo "<p>". $numero . "</p>". '<img src="b500.jpg" width="150px">' . " billetes de 500 <br>";
            $resto = $resto - $numero * 500;
        }

        if ($resto >= 200) {
            $numero = intdiv($resto, 200);
            echo "<p>". $numero . "</p>" . '<img src="b200.webp" width="150px">' . " billetes de 200 <br>";
            $resto = $resto - $numero * 200;
        }

        if ($resto >= 100) {
            $numero = intdiv($resto, 100);
            echo "<p>". $numero . "</p>" . '<img src="b100.webp" width="150px">' . " billetes de 100 <br>";
            $resto = $resto - $numero * 100;
        }

        if ($resto >= 50) {
            $numero = intdiv($resto, 50);
            echo "<p>". $numero . "</p>" . '<img src="b50.jpg" width="150px">' . " billetes de 50 <br>";
            $resto = $resto - $numero * 50;
        }

        if ($resto >= 20) {
            $numero = intdiv($resto, 20);
            echo "<p>". $numero . "</p>" . '<img src="b20 Draghi.jpg" width="150px">' . " billetes de 20 <br>";
            $resto = $resto - $numero * 20;
        }

        if ($resto >= 10) {
            $numero = intdiv($resto, 10);
            echo "<p>". $numero . "</p>" . '<img src="b10.jpg" width="150px">' . " billetes de 10 <br>";
            $resto = $resto - $numero * 10;
        }

        if ($resto >= 5) {
            $numero = intdiv($resto, 5);
            echo "<p>". $numero . "</p>" . '<img src="b5.webp" width="150px">' . " billetes de 5 <br>";
            $resto = $resto - $numero * 5;
        }

        if ($resto >= 2) {
            $numero = intdiv($resto, 2);
            echo "<p>". $numero . "</p>" . '<img src="m2.jpg" width="150px">' . " monedas de 2 <br>";
            $resto = $resto - $numero * 2;
        }

        if ($resto >= 1) {
            $numero = intdiv($resto, 1);
            echo "<p>". $numero . "</p>" . '<img src="m1.jpg" width="150px">' . " monedas de 1 <br>";
            $resto = $resto - $numero * 1;
        }

        $resto = $resto * 10;

        if ($resto >= 5) {
            $numero = intdiv($resto, 5);
            echo "<p>". $numero . "</p>" . '<img src="m050.jpg" width="150px">' . " monedas de 0,50 <br>";
            $resto = $resto - $numero * 5;
        }

        if ($resto >= 2) {
            $numero = intdiv($resto, 2);
            echo "<p>". $numero . "</p>" . '<img src="m020.webp" width="150px">' . " monedas de 0,20 <br>";
            $resto = $resto - $numero * 2;
        }

        if ($resto >= 1) {
            $numero = intdiv($resto, 1);
            echo "<p>". $numero . "</p>" . '<img src="m010.png" width="150px">' . " monedas de 0,10 <br>";
            $resto = $resto - $numero * 1;
        }

        $resto = $resto * 10;

        if ($resto >= 5) {
            $numero = intdiv($resto, 5);
            echo "<p>". $numero . "</p>" . '<img src="m005.jpg" width="150px">' . " monedas de 0,05 <br>";
            $resto = $resto - $numero * 5;
        }

        if ($resto >= 2) {
            $numero = intdiv($resto, 2);
            echo "<p>". $numero . "</p>" . '<img src="m002.webp" width="150px">' . " monedas de 0,02 <br>";
            $resto = $resto - $numero * 2;
        }

        if ($resto > 0) {

            echo "<p>". $resto . "</p>" . '<img src="m001.jpg" width="150px">' . " monedas de 0,01";
        }


        ?>




    </main>




</body>

</html>


CSS:

*{
box-sizing: border-box;

}

main{
margin-top: 20px;
margin-left: 20px;
}

main p{
font-size: 2em;
display: inline;
}



316 a 318: la operativa de las operaciones parece funcionar al operar... lo que no entiendo es por qué hice los dos formularios del header, habría que meterlo todo en el mismo, o como mucho que uno llevara al otro, no tener ahí los dos a la vez... las prisas, supongo.

323: ah, claro, no todo era entero, el importe inicial no es entero... ok, pues unos cuantos echo para revisar y ser felices por aquí, parametrar un if como los anteriores, juntar los dos formularios en el otro index… y supongo que bien


*** Día 01/12/2025

desayunos@javier.avisando.com... lo de los bukaneros

35: El último día es el 23, y volvemos el 7 de enero

PROGRAMA CAJERO, estado inicial:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Dar cambio</title>
    <link rel="stylesheet" href="style.css">
</head>

<body>

    <header>

        <form action="index.php" method="post">
            <input type="number" name="importe" id="importe" min=0.01 step=0.01>
            <input type="submit" value="Enviar">
        </form>

        <?php
        $importe = $_POST['importe'];
        $resto = $importe;
        ?>


    </header>

    <main>

        <?php
        if ($resto >= 500) {
            $numero = intdiv($resto, 500);
            echo "<p>". $numero . "</p>". '<img src="b500.jpg" width="150px">' . " billetes de 500 <br>";
            $resto = $resto - $numero * 500;
        }

        if ($resto >= 200) {
            $numero = intdiv($resto, 200);
            echo "<p>". $numero . "</p>" . '<img src="b200.webp" width="150px">' . " billetes de 200 <br>";
            $resto = $resto - $numero * 200;
        }

        if ($resto >= 100) {
            $numero = intdiv($resto, 100);
            echo "<p>". $numero . "</p>" . '<img src="b100.webp" width="150px">' . " billetes de 100 <br>";
            $resto = $resto - $numero * 100;
        }

        if ($resto >= 50) {
            $numero = intdiv($resto, 50);
            echo "<p>". $numero . "</p>" . '<img src="b50.jpg" width="150px">' . " billetes de 50 <br>";
            $resto = $resto - $numero * 50;
        }

        if ($resto >= 20) {
            $numero = intdiv($resto, 20);
            echo "<p>". $numero . "</p>" . '<img src="b20 Draghi.jpg" width="150px">' . " billetes de 20 <br>";
            $resto = $resto - $numero * 20;
        }

        if ($resto >= 10) {
            $numero = intdiv($resto, 10);
            echo "<p>". $numero . "</p>" . '<img src="b10.jpg" width="150px">' . " billetes de 10 <br>";
            $resto = $resto - $numero * 10;
        }

        if ($resto >= 5) {
            $numero = intdiv($resto, 5);
            echo "<p>". $numero . "</p>" . '<img src="b5.webp" width="150px">' . " billetes de 5 <br>";
            $resto = $resto - $numero * 5;
        }

        if ($resto >= 2) {
            $numero = intdiv($resto, 2);
            echo "<p>". $numero . "</p>" . '<img src="m2.jpg" width="150px">' . " monedas de 2 <br>";
            $resto = $resto - $numero * 2;
        }

        if ($resto >= 1) {
            $numero = intdiv($resto, 1);
            echo "<p>". $numero . "</p>" . '<img src="m1.jpg" width="150px">' . " monedas de 1 <br>";
            $resto = $resto - $numero * 1;
        }

        $resto = $resto * 10;

        if ($resto >= 5) {
            $numero = intdiv($resto, 5);
            echo "<p>". $numero . "</p>" . '<img src="m050.jpg" width="150px">' . " monedas de 0,50 <br>";
            $resto = $resto - $numero * 5;
        }

        if ($resto >= 2) {
            $numero = intdiv($resto, 2);
            echo "<p>". $numero . "</p>" . '<img src="m020.webp" width="150px">' . " monedas de 0,20 <br>";
            $resto = $resto - $numero * 2;
        }

        if ($resto >= 1) {
            $numero = intdiv($resto, 1);
            echo "<p>". $numero . "</p>" . '<img src="m010.png" width="150px">' . " monedas de 0,10 <br>";
            $resto = $resto - $numero * 1;
        }

        $resto = $resto * 10;

        if ($resto >= 5) {
            $numero = intdiv($resto, 5);
            echo "<p>". $numero . "</p>" . '<img src="m005.jpg" width="150px">' . " monedas de 0,05 <br>";
            $resto = $resto - $numero * 5;
        }

        if ($resto >= 2) {
            $numero = intdiv($resto, 2);
            echo "<p>". $numero . "</p>" . '<img src="m002.webp" width="150px">' . " monedas de 0,02 <br>";
            $resto = $resto - $numero * 2;
        }

        if ($resto > 0) {

            echo "<p>". $resto . "</p>" . '<img src="m001.jpg" width="150px">' . " monedas de 0,01";
        }


        ?>




    </main>




</body>

</html>


51: para 235,86 me queda ese resto de 1.0000000000014 monedas de 0,01, a igualar la parte de los céntimos al resto, o a asemejarla, mejor dicho

56, estado final con el cambio realizado en 54, he dejado la parte final así:

        if ($resto >= 2) {
            $numero = intdiv($resto, 2);
            echo "<p>" . $numero . "</p>" . '<img src="m002.webp" width="150px">' . " monedas de 0,02 <br>";
            $resto = $resto - $numero * 2;
        }

        if ($resto > 0) {
            $numero = intdiv($resto, 1);
            echo "<p>" . $numero . "</p>" . '<img src="m001.jpg" width="150px">' . " monedas de 0,01";
        }


        ?>




    </main>




</body>

</html>


Y paso al ejercicio anterior en 57. Aquí tengo que integrar los dos formularios iniciales que tengo, tengo que integrar esta parte:

    <header>
        <div>

            <h2> Escoge la operación a procesar </h2>
            <ol>

                <li> Sumas </li>
                <li> Restas </li>
                <li> Multiplicaciones </li>
                <li> Divisiones enteras </li>
            </ol>

            <form action="index.php" method="post">

                <input type="number" name="regla" min=1 max=4 step=1>
                <input type="submit" value="Enviar">

            </form>

            <?php
            $regla = $_POST['regla'];
            ?>

        </div>


        <div>

            <h2> Escoge el nivel de dificultad </h2>
            <ol>

                <li> Fácil </li>
                <li> Normal </li>
                <li> Complicado </li>
            </ol>

            <form action="index.php" method="post">

                <input type="number" name="dificultad" min=1 max=3 step=1>
                <input type="submit" value="Enviar">

            </form>

            <?php

            if ($_POST['dificultad'] == 1) {
                $lim1 = "1";
                $lim2 = "9";
            } elseif ($_POST['dificultad'] == 2) {
                $lim1 = "10";
                $lim2 = "99";
            } else {
                $lim1 = "100";
                $lim2 = "999";
            }

            ?>

        </div>
    </header>


62 corresponde a la distribución de 63
Y por eso paso de 64 a 65, que me lleva a 66

67: el bicho parece funcionar bien, pero tengo que cambiar también el header en este soluciones.php, cierto. Copiar y pegarlo desde index

Un br tras el segundo ol del header parece funcionar a la hora de cuadrar en línea ambos input... pero ni siquiera el placeholder o el width me amplían la casilla, ni el width en el CSS...

Buscando en Google "html longitud de un input"
Si necesitas ajustar el ancho visible del campo, puedes usar el atributo size:
Html

Copiar código
<input type="text" size="20" placeholder="Ancho visible ajustado">
Esto no afecta la cantidad de caracteres permitidos, solo el tamaño visual del campo.

Espero que esta información te sea útil para personalizar tus formularios. 😊

Pues no, con el size tampoco consigo nada...
75: el profesor usa max-width: 130px en el CSS, a ver si así va... pero 76, sigue igual

Header actualizado:

    <header>

        <form action="index.php" method="post">
            <div>

                <h2> Escoge la operación a procesar </h2>
                <ol>

                    <li> Sumas </li>
                    <li> Restas </li>
                    <li> Multiplicaciones </li>
                    <li> Divisiones enteras </li>
                </ol>

                <input type="number" name="regla" min=1 max=4 step=1 placeholder="Operación">

                <?php
                $regla = $_POST['regla'];
                ?>

            </div>


            <div>

                <h2> Escoge el nivel de dificultad </h2>
                <ol>

                    <li> Fácil </li>
                    <li> Normal </li>
                    <li> Complicado </li>
                </ol>
                <br>

                <input type="number" name="dificultad" min=1 max=3 step=1 placeholder="Dificultad">
                <input type="submit" value="Enviar">

                <?php

                if ($_POST['dificultad'] == 1) {
                    $lim1 = "1";
                    $lim2 = "9";
                } elseif ($_POST['dificultad'] == 2) {
                    $lim1 = "10";
                    $lim2 = "99";
                } else {
                    $lim1 = "100";
                    $lim2 = "999";
                }

                ?>

            </div>
        </form>
    </header>


CSS completo ahora:

* {
    box-sizing: border-box;

}

header form {

    display: grid;
    grid-template-columns: 1fr 1fr;

}

header input {
    max-width: 130px;
}

#tabla {
    margin-top: 30px;
    display: grid;
    grid-template-columns: repeat(5, 1fr);
    margin-bottom: 30px;
}

.ok {
    background-color: green;
}

.ko {
    background-color: red;
}

@media (max-width: 500px) {

    header form {

        grid-template-columns: 1fr;

    }

    #tabla {
        margin-top: 10px;
        grid-template-columns: 1fr;
        margin-bottom: 10px;
    }

}



YO
CSS Ir arriba
Ejercicios
Esbozo de web Orange Pi Descargar
Grid de 4 artículos y menú Descargar

ALFONSO
CSS ^
Ejercicios 1 CSS | Descargar
Orange PI CSS | Descargar
Grid 1 | Descargar
Areas | Descargar
Bukaneros | Descargar
PHP ^
Los Desayunos Bukaneros | Descargar
IVA | Descargar
IMC | Descargar
SUMAS | Descargar
TABLA DE MULTIPLICAR | Descargar
Gráficos de ventas carnicería | Descargar
Album de foto | Descargar
Mayor dígito de entero positivo de 3 cifras | Descargar
Imc con imágenes | Descargar
Cuadernillo Rubio Sumas | Descargar
Cuadernillo Rubio Sumas Mejora con bucles y arrays (Adelanto) | Descargar

YO POSTERIOR
CSS Ir arriba
Ejercicios
Esbozo de web Orange Pi Descargar
Grid de 4 artículos y menú Descargar... entiendo que es la del Oboe, y desde aquí hay que añadir
Bukaneros la de Vallecas
Examen
PHP según lo de Alfonso
Los Desayunos Bukaneros | Descargar...……………………. nole
IVA | Descargar...……………………. tengo una carpeta iva
IMC | Descargar...…………………. tengo la carpeta imc
SUMAS | Descargar...…………… tengo la carpeta sumas
TABLA DE MULTIPLICAR | Descargar...…………………………………. tengo la carpeta tabla
Gráficos de ventas carnicería | Descargar...……………. tengo la carpeta carnes, pero hay que arreglarlo, no funciona
Album de foto | Descargar...……………………………………. tengo la carpeta álbum
………………………. parece que aquí va lo de los números pares, if-par
Mayor dígito de entero positivo de 3 cifras | Descargar, if-dígitos
Imc con imágenes | Descargar, if-imc2
Cuadernillo Rubio Sumas | Descargar, if-rubio
Cuadernillo Rubio Sumas Mejora con bucles y arrays (Adelanto) | Descargar... sin paralelo en mí
if-cajero


*** Día 02/12/2025

Módulo: los valores decimales no tienen resto nunca, en ellos no se puede aplicar el módulo
En el caso del programa cajero tendríamos que multiplicar por 100 y trabajar con céntimos para usar el módulo. Con el módulo sacamos el resto, que sería mi $resto, para los siguientes if
Y luego se quita el resto para dividir entre el importe de la moneda y llegar a un valor entero de número de monedas
(Se ve en código en 15)

Trabajar con enteros es mejor que usar conversiones como intdiv o float, las conversiones pueden fallar para algunos valores, y eso no pasa con el trabajo con enteros

54: foreach recorre todos los valores de un array


https://www.php.net/manual/es/control-structures.foreach.php

La estructura foreach proporciona una forma sencilla de iterar sobre arrays y objetos Traversable. foreach generará un error cuando se utilice con una variable que contenga un tipo de dato diferente o con una variable no inicializada.

foreach puede obtener opcionalmente la key de cada elemento:

foreach (iterable_expression as $value) {
    statement_list
}

foreach (iterable_expression as $key => $value) {
    statement_list
}
La primera forma recorre el iterable dado por iterable_expression. En cada iteración, el valor del elemento actual se asigna a $value.

La segunda forma asignará adicionalmente la clave del elemento actual a la variable $key en cada iteración.

Tenga en cuenta que foreach no modifica el puntero interno del array, que es utilizado por funciones como current() y key().


EJERCICIO 1:
¿Cómo se determinan los años bisiestos?
Generalmente, un año es bisiesto si es divisible por 4.
Sin embargo, los años que son divisibles por 100 no son bisiestos, a menos que también sean divisibles por 400.
Por ejemplo, el año 2000 fue bisiesto (divisible por 400), pero 1900 no lo fue (solo divisible por 100). 
(Los de 100 no bisiestos son seculares)

Esto es un IF



EJERCICIO hasta el viernes:
Que con día-mes-año nos diga el día de la semana
(Ok, me puedo basar en el anterior para la traza hacia atrás/adelante)
(Parece ser que el 1/1/0001 fue lunes)
(Y nos dice que %7)

EJERCICIO QUE POR AHORA NO: número de días entre dos fechas

(Aunque parece que ya hay funciones internas de python y demás para estas cosas)


EJERCICIO 1:
if (($year%4==0) && (($year%100<>0) no lo sé/excepto ($year%400==0)))
if ((($year%4==0) && ($year%100<>0)) or (($year%4==0) && ($year%400==0)))

if (($year%4==0) && (($year%100<>0) no lo sé/excepto ($year%400==0)))............................. xor?
Bueno, por de pronto con un simple or lo veo bien, que es la integración matemática de lo anterior

Analizo (($year%100<>0) no lo sé/excepto ($year%400==0))
Año 095: me da igual, no se cumple el ($year%4==0)
Año 096: true+false........... valdría xor, porque queremos true
Año 100: false+false.......... valdría xor, no hay true así que da false
Año 400: false+true........... valdría xor
... entiendo que valdrían los dos: xor y or. Me quedo con or
if (($year%4==0) && (($year%100<>0) or ($year%400==0)))


RESULTADO:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> Años bisiestos </title>
</head>

<body>


    <header>

        <form action="index.php" method="post">
            <input type="number" name="year" id="year" min=1 step=1>
            <input type="submit" value="Enviar">
        </form>

        <?php
        $year = $_POST['year'];
        ?>


    </header>

    <main>

        <?php
        if ((($year % 4 == 0) && ($year % 100 <> 0)) or (($year % 4 == 0) && ($year % 400 == 0))) {

            echo "El año {$year} es bisiesto";
        } else {

            echo "El año {$year} no es bisiesto";
        }

        ?>

    </main>


</body>

</html>



>< no funciona como distinto, sólo <>


Voy con EJERCICIO VIERNES:

(($month==1) && ($day>31)) or ... para repetir en 75... Ah, calla, que febrero es especial en los bisiestos

77: mira tú por dónde que al final viene bien esto de los colorines de los paréntesis, con esto detecto que me he cargado uno de más.
78: efectivamente

80: no me hace falta un paréntesis delante de la admiración en:
        if ( (($month == 2) && ($day == 29)) &&  !((($year % 4 == 0) && ($year % 100 <> 0)) or (($year % 4 == 0) && ($year % 400 == 0)))) 


Ya tengo mi header al menos:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> Número de días </title>
</head>

<body>

    <!-- 
Que con día-mes-año nos diga el día de la semana
(Ok, me puedo basar en el bisiesto para la traza hacia atrás/adelante)
      if ((($year % 4 == 0) && ($year % 100 <> 0)) or (($year % 4 == 0) && ($year % 400 == 0))) 
(Parece ser que el 1/1/0001 fue lunes)
(Y nos dice que %7)
 -->

    <header>

        <form action="index.php" method="post">
            <input type="number" name="day" id="day" min=1 max=31 step=1 placeholder="Día">
            <input type="number" name="month" id="month" min=1 max=12 step=1 placeholder="Mes">
            <input type="number" name="year" id="year" min=1 step=1 placeholder="Año">
            <input type="submit" value="Enviar">
        </form>

        <?php
        $day = $_POST['day'];
        $month = $_POST['month'];
        $year = $_POST['year'];
        $paso = "pasa";

        if ((($month == 1) && ($day > 31)) or (($month == 2) && ($day > 29)) or (($month == 3) && ($day > 31)) or (($month == 4) && ($day > 30)) or (($month == 5) && ($day > 31)) or (($month == 6) && ($day > 30)) or (($month == 7) && ($day > 31)) or (($month == 8) && ($day > 31)) or (($month == 9) && ($day > 30)) or (($month == 10) && ($day > 31)) or (($month == 11) && ($day > 30)) or (($month == 12) && ($day > 31))) {
            echo "El día del mes no es correcto";
            $paso = "no";
        }

        if ((($month == 2) && ($day == 29)) &&  !((($year % 4 == 0) && ($year % 100 <> 0)) or (($year % 4 == 0) && ($year % 400 == 0)))) {
            echo "El día del mes no es correcto, ese año no es bisiesto";
            $paso = "no";
        }
        ?>

    </header>

    <main>



    </main>


</body>

</html>


*** Día 03/12/2025

1: bonita diferencia, parece que el // para comentar sólo funciona dentro de la parte php


PRIMER ESBOZO DEFINITIVO:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> Día de la semana </title>
</head>

<body>

    <!-- 
Que con día-mes-año nos diga el día de la semana
(Ok, me puedo basar en el bisiesto para la traza hacia atrás/adelante)
      if ((($year % 4 == 0) && ($year % 100 <> 0)) or (($year % 4 == 0) && ($year % 400 == 0))) 
(Parece ser que el 1/1/0001 fue lunes)
(Y nos dice que %7)
 -->

    <header>

        <form action="index.php" method="post">
            <input type="number" name="day" id="day" min=1 max=31 step=1 placeholder="Día">
            <input type="number" name="month" id="month" min=1 max=12 step=1 placeholder="Mes">
            <input type="number" name="year" id="year" min=1 step=1 placeholder="Año">
            <input type="submit" value="Enviar">
        </form>

        <?php
        $day = $_POST['day'];
        $month = $_POST['month'];
        $year = $_POST['year'];
        $paso = "pasa";

        if ((($month == 1) && ($day > 31)) or (($month == 2) && ($day > 29)) or (($month == 3) && ($day > 31)) or (($month == 4) && ($day > 30)) or (($month == 5) && ($day > 31)) or (($month == 6) && ($day > 30)) or (($month == 7) && ($day > 31)) or (($month == 8) && ($day > 31)) or (($month == 9) && ($day > 30)) or (($month == 10) && ($day > 31)) or (($month == 11) && ($day > 30)) or (($month == 12) && ($day > 31))) {
            echo "El día del mes no es correcto";
            $paso = "no";
        }

        if ((($month == 2) && ($day == 29)) &&  !((($year % 4 == 0) && ($year % 100 <> 0)) or (($year % 4 == 0) && ($year % 400 == 0)))) {
            echo "El día del mes no es correcto, ese año no es bisiesto";
            $paso = "no";
        }
        ?>

    </header>

    <main>


        <?php

        if ($paso = "pasa") {

            //El paso, sólo pasa cuando está bien la fecha solicitada

            //Calculando la masa inicial de días
            $totaldays = ($year - 1) * 365;

            //Añado los supuestos bisiestos 
            $b = ($year - 1) % 4;
            $totaldays = $totaldays + ($year - $b) / 4;

            //Resto los falsos bisiestos de 100, los años seculares
            $b = ($year - 1) % 100;
            $totaldays = $totaldays - ($year - $b) / 100;

            //Sumo los verdaderos bisiestos de 400 
            $b = ($year - 1) % 400;
            $totaldays = $totaldays + ($year - $b) / 400;

            //Añadir la parte del año en curso
            if (($month - 1) == 11) {
                $yearcur = 334;
            } else if (($month - 1) == 10) {
                $yearcur = 304;
            } else if (($month - 1) == 9) {
                $yearcur = 273;
            } else if (($month - 1) == 8) {
                $yearcur = 243;
            } else if (($month - 1) == 7) {
                $yearcur = 212;
            } else if (($month - 1) == 6) {
                $yearcur = 181;  //Los famosos 181 días del primer semestre
            } else if (($month - 1) == 5) {
                $yearcur = 151;
            } else if (($month - 1) == 4) {
                $yearcur = 120;
            } else if (($month - 1) == 3) {
                $yearcur = 90;
            } else if (($month - 1) == 2) {
                $yearcur = 59;
            } else if (($month - 1) == 1) {
                $yearcur = 31;
            }

            if (((($year % 4 == 0) && ($year % 100 <> 0)) or (($year % 4 == 0) && ($year % 400 == 0))) && (($month - 1) >= 2)) {
                $yearcur = $yearcur + 1;
            }

            $yearcur = $yearcur + $day;
            $totaldays = $totaldays + $yearcur;

            //Calcular ya el día de la semana
            $resto = $totaldays % 7;

            if ($resto == 1) {
                $diasem = "lunes";
            } else if ($resto == 2) {
                $diasem = "martes";
            } else if ($resto == 3) {
                $diasem = "miércoles";
            } else if ($resto == 4) {
                $diasem = "jueves";
            } else if ($resto == 5) {
                $diasem = "viernes";
            } else if ($resto == 6) {
                $diasem = "sábado";
            } else {
                $diasem = "domingo";
            }

            //El echo que te dice el resultado

            echo "El " . $day . " del " . $month . " de " . $year . " fue {$diasem}";
        }


        ?>
    </main>


</body>

</html>


59 y 60: con el isset me quito respecto a 57 un error y el echo incorrecto de "El del de fue domingo"
69: parece que bien con esto, no toco más:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> Día de la semana </title>
</head>

<body>

    <!-- 
Que con día-mes-año nos diga el día de la semana
(Ok, me puedo basar en el bisiesto para la traza hacia atrás/adelante)
      if ((($year % 4 == 0) && ($year % 100 <> 0)) or (($year % 4 == 0) && ($year % 400 == 0))) 
(Parece ser que el 1/1/0001 fue lunes)
(Y nos dice que %7)
 -->

    <header>

        <form action="index.php" method="post">
            <input type="number" name="day" id="day" min=1 max=31 step=1 placeholder="Día">
            <input type="number" name="month" id="month" min=1 max=12 step=1 placeholder="Mes">
            <input type="number" name="year" id="year" min=1 step=1 placeholder="Año">
            <input type="submit" value="Enviar">
        </form>

        <?php
        $day = $_POST['day'];
        $month = $_POST['month'];
        $year = $_POST['year'];
        $paso = "pasa";

        if ((($month == 1) && ($day > 31)) or (($month == 2) && ($day > 29)) or (($month == 3) && ($day > 31)) or (($month == 4) && ($day > 30)) or (($month == 5) && ($day > 31)) or (($month == 6) && ($day > 30)) or (($month == 7) && ($day > 31)) or (($month == 8) && ($day > 31)) or (($month == 9) && ($day > 30)) or (($month == 10) && ($day > 31)) or (($month == 11) && ($day > 30)) or (($month == 12) && ($day > 31))) {
            echo "El día del mes no es correcto";
            $paso = "no";
        }

        if ((($month == 2) && ($day == 29)) &&  !((($year % 4 == 0) && ($year % 100 <> 0)) or (($year % 4 == 0) && ($year % 400 == 0)))) {
            echo "El día del mes no es correcto, ese año no es bisiesto";
            $paso = "no";
        }
        ?>

    </header>

    <main>


        <?php

        if (($paso = "pasa") && isset ($day)) {

            //El paso, sólo pasa cuando está bien la fecha solicitada

            //Calculando la masa inicial de días
            $totaldays = ($year - 1) * 365;

            //Añado los supuestos bisiestos 
            $b = ($year - 1) % 4;
            $totaldays = $totaldays + ($year - $b) / 4;

            //Resto los falsos bisiestos de 100, los años seculares
            $b = ($year - 1) % 100;
            $totaldays = $totaldays - ($year - $b) / 100;

            //Sumo los verdaderos bisiestos de 400 
            $b = ($year - 1) % 400;
            $totaldays = $totaldays + ($year - $b) / 400;

            //Añadir la parte del año en curso
            if (($month - 1) == 11) {
                $yearcur = 334;
            } else if (($month - 1) == 10) {
                $yearcur = 304;
            } else if (($month - 1) == 9) {
                $yearcur = 273;
            } else if (($month - 1) == 8) {
                $yearcur = 243;
            } else if (($month - 1) == 7) {
                $yearcur = 212;
            } else if (($month - 1) == 6) {
                $yearcur = 181;  //Los famosos 181 días del primer semestre
            } else if (($month - 1) == 5) {
                $yearcur = 151;
            } else if (($month - 1) == 4) {
                $yearcur = 120;
            } else if (($month - 1) == 3) {
                $yearcur = 90;
            } else if (($month - 1) == 2) {
                $yearcur = 59;
            } else if (($month - 1) == 1) {
                $yearcur = 31;
            }

            if (((($year % 4 == 0) && ($year % 100 <> 0)) or (($year % 4 == 0) && ($year % 400 == 0))) && (($month - 1) >= 2)) {
                $yearcur = $yearcur + 1;
            }

            $yearcur = $yearcur + $day;
            $totaldays = $totaldays + $yearcur;

            //Calcular ya el día de la semana
            $resto = $totaldays % 7;

            if ($resto == 1) {
                $diasem = "lunes";
            } else if ($resto == 2) {
                $diasem = "martes";
            } else if ($resto == 3) {
                $diasem = "miércoles";
            } else if ($resto == 4) {
                $diasem = "jueves";
            } else if ($resto == 5) {
                $diasem = "viernes";
            } else if ($resto == 6) {
                $diasem = "sábado";
            } else {
                $diasem = "domingo";
            }

            //El echo que te dice el resultado

            echo "El " . $day . " del " . $month . " de " . $year . " fue {$diasem}";
        }


        ?>
    </main>


</body>

</html>

EJERCICIO QUE POR AHORA NO: número de días entre dos fechas... y voy a probar

71, 72: por el cambio de simbolitos en la cabecera
73, 74: para no andar modificando los nombres de las variables en masa, esto sería un "Reemplazar todos" con el bloque marcado, por ejemplo

A resolver esto de 77:
Entre el del de y el del de hay 0 días
Más que nada porque has puesto la misma fecha en las dos líneas

Con los isset de 78 vemos que en 79 hay menos errores ya de entrada

80, 81: ah, problemas con el famoso año 1
Warning: Undefined variable $yearcur in /home/arturo/public_html/php/if/numdias/index.php on line 118
Entre el lunes1 del 1 de 1 y el miércoles2 del 1 de 1hay 2 días

Claro, la línea 118 es $yearcur = $yearcur + $day; y no tengo nada en $yearcur porque no hay meses anteriores... REV si queremos esto del año 1

82, 83: REV, corregir esto de $yearcur para las fechas de enero, ok. EN AMBOS FICHEROS (**)
85: corregida la falta de espacios

87: no es por el año 1, son problemas con enero... REV, es como si no restara los días de la primera fecha
Hipótesis: vale, creo que es por el tema de $yearcur, porque estoy usando la misma variable en los dos div sin inicializarla al comienzo del segundo... Entiendo que con un $yearcur=0 antes del proceso ya quedará resuelto... (sólo en este fichero)

88, 89: interesante, no entiendo por qué esto SÓLO FALLA EN ENERO, en principio debería aplicar el mismo fallo a todos los meses, pero no... REV, estudiar esta cosita. O quién sabe, tal vez sólo con el $yearcur== ese que meteré ya tire.

(**) ¿Tiene sentido corregirlo en el primer fichero??? Veremos


ESTADO EN ESTOS MOMENTOS:
<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> Días entre fechas </title>
</head>

<body>

    <!-- 
número de días entre dos fechas
 -->

    <header>

        <form action="index.php" method="post">
            <input type="number" name="day1" id="day1" min=1 max=31 step=1 placeholder="Día">
            <input type="number" name="month1" id="month1" min=1 max=12 step=1 placeholder="Mes">
            <input type="number" name="year1" id="year1" min=1 step=1 placeholder="Año"> <br>
            <input type="number" name="day2" id="day2" min=1 max=31 step=1 placeholder="Día">
            <input type="number" name="month2" id="month2" min=1 max=12 step=1 placeholder="Mes">
            <input type="number" name="year2" id="year2" min=1 step=1 placeholder="Año"> <br>
            <input type="submit" value="Enviar">
        </form>

        <?php
        $day1 = $_POST['day1'];
        $month1 = $_POST['month1'];
        $year1 = $_POST['year1'];
        $day2 = $_POST['day2'];
        $month2 = $_POST['month2'];
        $year2 = $_POST['year2'];
        $paso = "pasa";

        if ((($month1 == 1) && ($day1 > 31)) or (($month1 == 2) && ($day1 > 29)) or (($month1 == 3) && ($day1 > 31)) or (($month1 == 4) && ($day1 > 30)) or (($month1 == 5) && ($day1 > 31)) or (($month1 == 6) && ($day1 > 30)) or (($month1 == 7) && ($day1 > 31)) or (($month1 == 8) && ($day1 > 31)) or (($month1 == 9) && ($day1 > 30)) or (($month1 == 10) && ($day1 > 31)) or (($month1 == 11) && ($day1 > 30)) or (($month1 == 12) && ($day1 > 31))) {
            echo "El día del mes de la primera fecha no es correcto";
            $paso = "no";
        }

        if ((($month1 == 2) && ($day1 == 29)) &&  !((($year1 % 4 == 0) && ($year1 % 100 <> 0)) or (($year1 % 4 == 0) && ($year1 % 400 == 0)))) {
            echo "El día del mes de la primera fecha no es correcto, ese año no es bisiesto";
            $paso = "no";
        }

        if ((($month2 == 1) && ($day2 > 31)) or (($month2 == 2) && ($day2 > 29)) or (($month2 == 3) && ($day2 > 31)) or (($month2 == 4) && ($day2 > 30)) or (($month2 == 5) && ($day2 > 31)) or (($month2 == 6) && ($day2 > 30)) or (($month2 == 7) && ($day2 > 31)) or (($month2 == 8) && ($day2 > 31)) or (($month2 == 9) && ($day2 > 30)) or (($month2 == 10) && ($day2 > 31)) or (($month2 == 11) && ($day2 > 30)) or (($month2 == 12) && ($day2 > 31))) {
            echo "El día del mes de la segunda fecha no es correcto";
            $paso = "no";
        }

        if ((($month2 == 2) && ($day2 == 29)) &&  !((($year2 % 4 == 0) && ($year2 % 100 <> 0)) or (($year2 % 4 == 0) && ($year2 % 400 == 0)))) {
            echo "El día del mes de la segunda fecha no es correcto, ese año no es bisiesto";
            $paso = "no";
        }
        ?>

    </header>

    <main>

        <div id="fecha1">

            <?php

            if (($paso = "pasa") && isset($day1)) {

                //El paso, sólo pasa cuando está bien la fecha 1 solicitada

                $year = $year1;
                $month = $month1;
                $day = $day1;

                //Calculando la masa inicial de días
                $totaldays = ($year - 1) * 365;

                //Añado los supuestos bisiestos 
                $b = ($year - 1) % 4;
                $totaldays = $totaldays + ($year - $b) / 4;

                //Resto los falsos bisiestos de 100, los años seculares
                $b = ($year - 1) % 100;
                $totaldays = $totaldays - ($year - $b) / 100;

                //Sumo los verdaderos bisiestos de 400 
                $b = ($year - 1) % 400;
                $totaldays = $totaldays + ($year - $b) / 400;

                //Añadir la parte del año en curso
                if (($month - 1) == 11) {
                    $yearcur = 334;
                } else if (($month - 1) == 10) {
                    $yearcur = 304;
                } else if (($month - 1) == 9) {
                    $yearcur = 273;
                } else if (($month - 1) == 8) {
                    $yearcur = 243;
                } else if (($month - 1) == 7) {
                    $yearcur = 212;
                } else if (($month - 1) == 6) {
                    $yearcur = 181;  //Los famosos 181 días del primer semestre
                } else if (($month - 1) == 5) {
                    $yearcur = 151;
                } else if (($month - 1) == 4) {
                    $yearcur = 120;
                } else if (($month - 1) == 3) {
                    $yearcur = 90;
                } else if (($month - 1) == 2) {
                    $yearcur = 59;
                } else if (($month - 1) == 1) {
                    $yearcur = 31;
                }

                if (((($year % 4 == 0) && ($year % 100 <> 0)) or (($year % 4 == 0) && ($year % 400 == 0))) && (($month - 1) >= 2)) {
                    $yearcur = $yearcur + 1;
                }

                $yearcur = $yearcur + $day;
                $totaldays = $totaldays + $yearcur;

                //Calcular ya el día de la semana
                $resto = $totaldays % 7;

                if ($resto == 1) {
                    $diasem = "lunes";
                } else if ($resto == 2) {
                    $diasem = "martes";
                } else if ($resto == 3) {
                    $diasem = "miércoles";
                } else if ($resto == 4) {
                    $diasem = "jueves";
                } else if ($resto == 5) {
                    $diasem = "viernes";
                } else if ($resto == 6) {
                    $diasem = "sábado";
                } else {
                    $diasem = "domingo";
                }

                //Resultado parcial
                $diasem1 = $diasem;
                $totaldays1 = $totaldays;
            }


            ?>
        </div>

        <div id="fecha2">

            <?php

            if (($paso = "pasa") && isset($day2)) {

                //El paso, sólo pasa cuando está bien la fecha 2 solicitada

                $year = $year2;
                $month = $month2;
                $day = $day2;

                //Calculando la masa inicial de días
                $totaldays = ($year - 1) * 365;

                //Añado los supuestos bisiestos 
                $b = ($year - 1) % 4;
                $totaldays = $totaldays + ($year - $b) / 4;

                //Resto los falsos bisiestos de 100, los años seculares
                $b = ($year - 1) % 100;
                $totaldays = $totaldays - ($year - $b) / 100;

                //Sumo los verdaderos bisiestos de 400 
                $b = ($year - 1) % 400;
                $totaldays = $totaldays + ($year - $b) / 400;

                //Añadir la parte del año en curso
                if (($month - 1) == 11) {
                    $yearcur = 334;
                } else if (($month - 1) == 10) {
                    $yearcur = 304;
                } else if (($month - 1) == 9) {
                    $yearcur = 273;
                } else if (($month - 1) == 8) {
                    $yearcur = 243;
                } else if (($month - 1) == 7) {
                    $yearcur = 212;
                } else if (($month - 1) == 6) {
                    $yearcur = 181;  //Los famosos 181 días del primer semestre
                } else if (($month - 1) == 5) {
                    $yearcur = 151;
                } else if (($month - 1) == 4) {
                    $yearcur = 120;
                } else if (($month - 1) == 3) {
                    $yearcur = 90;
                } else if (($month - 1) == 2) {
                    $yearcur = 59;
                } else if (($month - 1) == 1) {
                    $yearcur = 31;
                }

                if (((($year % 4 == 0) && ($year % 100 <> 0)) or (($year % 4 == 0) && ($year % 400 == 0))) && (($month - 1) >= 2)) {
                    $yearcur = $yearcur + 1;
                }

                $yearcur = $yearcur + $day;
                $totaldays = $totaldays + $yearcur;

                //Calcular ya el día de la semana
                $resto = $totaldays % 7;

                if ($resto == 1) {
                    $diasem = "lunes";
                } else if ($resto == 2) {
                    $diasem = "martes";
                } else if ($resto == 3) {
                    $diasem = "miércoles";
                } else if ($resto == 4) {
                    $diasem = "jueves";
                } else if ($resto == 5) {
                    $diasem = "viernes";
                } else if ($resto == 6) {
                    $diasem = "sábado";
                } else {
                    $diasem = "domingo";
                }

                //Resultado parcial
                $diasem2 = $diasem;
                $totaldays2 = $totaldays;
            }


            ?>
        </div>

        <!-- Filtro por no filtrar las fechas en el header -->

        <?php

        if (isset($day1) && isset($day2)) {
            if ($totaldays2 > $totaldays1) {
                $numdays = $totaldays2 - $totaldays1;
            } else {
                $numdays = $totaldays1 - $totaldays2;
            }

            //El echo que te dice el resultado

            echo "Entre el {$diasem1} " . $day1 . " del " . $month1 . " de " . $year1 . " y el {$diasem2} " . $day2 . " del " . $month2 . " de " . $year2 . " hay {$numdays} día";

            if ($numdays > 1) {
                echo "s";
            }
            if ($numdays == 0) {
                echo "<br> Más que nada porque has puesto la misma fecha en las dos líneas";
            }
        }

        ?>

    </main>


</body>

</html>


*** Día 04/12/2025

1 es el valor por defecto del step 

1, 2: con el print_r de 1 se ve 2
6: bonita distribución de la condición del if en 3 partes
13: || es OR
15, 16: al ser una operación mejor que esté entre paréntesis

18:$year--; resta 1 a $year

23: en el switch puedes omitir el break si quieres que se valoren varias posibilidades
default es "En cualquier otro caso", es un else.
Switch es más rápido que un if, pero sólo vale para una variable
Si no metemos ningún break también hará el default
Podemos ponerle variables o expresiones que den números o palabras, pero no condiciones que den true-false como las del if

32: function es una subrutina, subprograma, método...

40, 41: error resuelto

42: include incluye un fichero dentro de otro

47: el for es el bucle más rápido

https://www.php.net/manual/es/control-structures.for.php
for (expr1; expr2; expr3)
    comandos
La primera expresión (expr1) es evaluada (ejecutada), en cualquier caso al inicio de la bucle.

Al inicio de cada iteración, la expresión expr2 es evaluada. Si la evaluación es true, la bucle continúa y los comandos son ejecutados. Si la evaluación es false, la ejecución de la bucle se detiene.

Al final de cada iteración, la expresión expr3 es evaluada (ejecutada).



<?php
/* ejemplo 1 */

for ($i = 1; $i <= 10; $i++) {
    echo $i;
}

/* ejemplo 2 */

for ($i = 1; ; $i++) {
    if ($i > 10) {
        break;
    }
    echo $i;
}

/* ejemplo 3 */

$i = 1;
for (; ; ) {
    if ($i > 10) {
        break;
    }
    echo $i;
    $i++;
}

/* ejemplo 4 */

for ($i = 1, $j = 0; $i <= 10; $j += $i, print $i, $i++);
?>


48: el primer 31 de $meses es la posición 0, es un array
La segunda expresión del FOR de aquí es un mientras (es como un WHILE de Basic), no se llega al valor $m igual a $meses


52: funciones.php es una librería llamada con include, que se puede usar en otros programas

54 permite usar 55, y luego llegar a 56


87: Warning: Undefined variable $yearcur in /home/arturo/public_html/php/if/diasemana/index.php on line 101
Viene por esto:

            } else if (($month - 1) == 1) {
                $yearcur = 31;
            }

            if (((($year % 4 == 0) && ($year % 100 <> 0)) or (($year % 4 == 0) && ($year % 400 == 0))) && (($month - 1) >= 2)) {
                $yearcur = $yearcur + 1;
            }

            $yearcur = $yearcur + $day;

Es decir, cuidado con las variables que vienen de un if, mejor declararlas antes, eso pienso.

Añado una declaración de variable a 0:
            //Añadir la parte del año en curso
            $yearcur = 0;


FICHERO TRAS EL CAMBIO:
<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> Día de la semana </title>
</head>

<body>

    <!-- 
Que con día-mes-año nos diga el día de la semana
(Ok, me puedo basar en el bisiesto para la traza hacia atrás/adelante)
      if ((($year % 4 == 0) && ($year % 100 <> 0)) or (($year % 4 == 0) && ($year % 400 == 0))) 
(Parece ser que el 1/1/0001 fue lunes)
(Y nos dice que %7)
 -->

    <header>

        <form action="index.php" method="post">
            <input type="number" name="day" id="day" min=1 max=31 step=1 placeholder="Día">
            <input type="number" name="month" id="month" min=1 max=12 step=1 placeholder="Mes">
            <input type="number" name="year" id="year" min=1 step=1 placeholder="Año">
            <input type="submit" value="Enviar">
        </form>

        <?php
        $day = $_POST['day'];
        $month = $_POST['month'];
        $year = $_POST['year'];
        $paso = "pasa";

        if ((($month == 1) && ($day > 31)) or (($month == 2) && ($day > 29)) or (($month == 3) && ($day > 31)) or (($month == 4) && ($day > 30)) or (($month == 5) && ($day > 31)) or (($month == 6) && ($day > 30)) or (($month == 7) && ($day > 31)) or (($month == 8) && ($day > 31)) or (($month == 9) && ($day > 30)) or (($month == 10) && ($day > 31)) or (($month == 11) && ($day > 30)) or (($month == 12) && ($day > 31))) {
            echo "El día del mes no es correcto";
            $paso = "no";
        }

        if ((($month == 2) && ($day == 29)) &&  !((($year % 4 == 0) && ($year % 100 <> 0)) or (($year % 4 == 0) && ($year % 400 == 0)))) {
            echo "El día del mes no es correcto, ese año no es bisiesto";
            $paso = "no";
        }
        ?>

    </header>

    <main>


        <?php

        if (($paso = "pasa") && isset($day)) {

            //El paso, sólo pasa cuando está bien la fecha solicitada

            //Calculando la masa inicial de días
            $totaldays = ($year - 1) * 365;

            //Añado los supuestos bisiestos 
            $b = ($year - 1) % 4;
            $totaldays = $totaldays + ($year - $b) / 4;

            //Resto los falsos bisiestos de 100, los años seculares
            $b = ($year - 1) % 100;
            $totaldays = $totaldays - ($year - $b) / 100;

            //Sumo los verdaderos bisiestos de 400 
            $b = ($year - 1) % 400;
            $totaldays = $totaldays + ($year - $b) / 400;

            //Añadir la parte del año en curso
            $yearcur = 0;

            if (($month - 1) == 11) {
                $yearcur = 334;
            } else if (($month - 1) == 10) {
                $yearcur = 304;
            } else if (($month - 1) == 9) {
                $yearcur = 273;
            } else if (($month - 1) == 8) {
                $yearcur = 243;
            } else if (($month - 1) == 7) {
                $yearcur = 212;
            } else if (($month - 1) == 6) {
                $yearcur = 181;  //Los famosos 181 días del primer semestre
            } else if (($month - 1) == 5) {
                $yearcur = 151;
            } else if (($month - 1) == 4) {
                $yearcur = 120;
            } else if (($month - 1) == 3) {
                $yearcur = 90;
            } else if (($month - 1) == 2) {
                $yearcur = 59;
            } else if (($month - 1) == 1) {
                $yearcur = 31;
            }

            if (((($year % 4 == 0) && ($year % 100 <> 0)) or (($year % 4 == 0) && ($year % 400 == 0))) && (($month - 1) >= 2)) {
                $yearcur = $yearcur + 1;
            }

            $yearcur = $yearcur + $day;
            $totaldays = $totaldays + $yearcur;

            //Calcular ya el día de la semana
            $resto = $totaldays % 7;

            if ($resto == 1) {
                $diasem = "lunes";
            } else if ($resto == 2) {
                $diasem = "martes";
            } else if ($resto == 3) {
                $diasem = "miércoles";
            } else if ($resto == 4) {
                $diasem = "jueves";
            } else if ($resto == 5) {
                $diasem = "viernes";
            } else if ($resto == 6) {
                $diasem = "sábado";
            } else {
                $diasem = "domingo";
            }

            //El echo que te dice el resultado

            echo "<br>El " . $day . " del " . $month . " de " . $year . " fue {$diasem}";
        }


        ?>
    </main>


</body>

</html>


Añado el cambio al ejercicio 3 en las dos mitades:
            //Añadir la parte del año en curso
            $yearcur = 0;

Efectivamente, una variable null no aplica cero, es la inexistencia

94 a 97: no entiendo lo de 94, REV (pero parece un caso excepcional... ¿reiniciar el navegador?)

EJERCICIO 3 TRAS EL CAMBIO:
<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> Días entre fechas </title>
</head>

<body>

    <!-- 
número de días entre dos fechas
 -->

    <header>

        <form action="index.php" method="post">
            <input type="number" name="day1" id="day1" min=1 max=31 step=1 placeholder="Día">
            <input type="number" name="month1" id="month1" min=1 max=12 step=1 placeholder="Mes">
            <input type="number" name="year1" id="year1" min=1 step=1 placeholder="Año"> <br>
            <input type="number" name="day2" id="day2" min=1 max=31 step=1 placeholder="Día">
            <input type="number" name="month2" id="month2" min=1 max=12 step=1 placeholder="Mes">
            <input type="number" name="year2" id="year2" min=1 step=1 placeholder="Año"> <br>
            <input type="submit" value="Enviar">
        </form>

        <?php
        $day1 = $_POST['day1'];
        $month1 = $_POST['month1'];
        $year1 = $_POST['year1'];
        $day2 = $_POST['day2'];
        $month2 = $_POST['month2'];
        $year2 = $_POST['year2'];
        $paso = "pasa";

        if ((($month1 == 1) && ($day1 > 31)) or (($month1 == 2) && ($day1 > 29)) or (($month1 == 3) && ($day1 > 31)) or (($month1 == 4) && ($day1 > 30)) or (($month1 == 5) && ($day1 > 31)) or (($month1 == 6) && ($day1 > 30)) or (($month1 == 7) && ($day1 > 31)) or (($month1 == 8) && ($day1 > 31)) or (($month1 == 9) && ($day1 > 30)) or (($month1 == 10) && ($day1 > 31)) or (($month1 == 11) && ($day1 > 30)) or (($month1 == 12) && ($day1 > 31))) {
            echo "El día del mes de la primera fecha no es correcto";
            $paso = "no";
        }

        if ((($month1 == 2) && ($day1 == 29)) &&  !((($year1 % 4 == 0) && ($year1 % 100 <> 0)) or (($year1 % 4 == 0) && ($year1 % 400 == 0)))) {
            echo "El día del mes de la primera fecha no es correcto, ese año no es bisiesto";
            $paso = "no";
        }

        if ((($month2 == 1) && ($day2 > 31)) or (($month2 == 2) && ($day2 > 29)) or (($month2 == 3) && ($day2 > 31)) or (($month2 == 4) && ($day2 > 30)) or (($month2 == 5) && ($day2 > 31)) or (($month2 == 6) && ($day2 > 30)) or (($month2 == 7) && ($day2 > 31)) or (($month2 == 8) && ($day2 > 31)) or (($month2 == 9) && ($day2 > 30)) or (($month2 == 10) && ($day2 > 31)) or (($month2 == 11) && ($day2 > 30)) or (($month2 == 12) && ($day2 > 31))) {
            echo "El día del mes de la segunda fecha no es correcto";
            $paso = "no";
        }

        if ((($month2 == 2) && ($day2 == 29)) &&  !((($year2 % 4 == 0) && ($year2 % 100 <> 0)) or (($year2 % 4 == 0) && ($year2 % 400 == 0)))) {
            echo "El día del mes de la segunda fecha no es correcto, ese año no es bisiesto";
            $paso = "no";
        }
        ?>

    </header>

    <main>

        <div id="fecha1">

            <?php

            if (($paso = "pasa") && isset($day1)) {

                //El paso, sólo pasa cuando está bien la fecha 1 solicitada

                $year = $year1;
                $month = $month1;
                $day = $day1;

                //Calculando la masa inicial de días
                $totaldays = ($year - 1) * 365;

                //Añado los supuestos bisiestos 
                $b = ($year - 1) % 4;
                $totaldays = $totaldays + ($year - $b) / 4;

                //Resto los falsos bisiestos de 100, los años seculares
                $b = ($year - 1) % 100;
                $totaldays = $totaldays - ($year - $b) / 100;

                //Sumo los verdaderos bisiestos de 400 
                $b = ($year - 1) % 400;
                $totaldays = $totaldays + ($year - $b) / 400;

                //Añadir la parte del año en curso
                $yearcur = 0;

                if (($month - 1) == 11) {
                    $yearcur = 334;
                } else if (($month - 1) == 10) {
                    $yearcur = 304;
                } else if (($month - 1) == 9) {
                    $yearcur = 273;
                } else if (($month - 1) == 8) {
                    $yearcur = 243;
                } else if (($month - 1) == 7) {
                    $yearcur = 212;
                } else if (($month - 1) == 6) {
                    $yearcur = 181;  //Los famosos 181 días del primer semestre
                } else if (($month - 1) == 5) {
                    $yearcur = 151;
                } else if (($month - 1) == 4) {
                    $yearcur = 120;
                } else if (($month - 1) == 3) {
                    $yearcur = 90;
                } else if (($month - 1) == 2) {
                    $yearcur = 59;
                } else if (($month - 1) == 1) {
                    $yearcur = 31;
                }

                if (((($year % 4 == 0) && ($year % 100 <> 0)) or (($year % 4 == 0) && ($year % 400 == 0))) && (($month - 1) >= 2)) {
                    $yearcur = $yearcur + 1;
                }

                $yearcur = $yearcur + $day;
                $totaldays = $totaldays + $yearcur;

                //Calcular ya el día de la semana
                $resto = $totaldays % 7;

                if ($resto == 1) {
                    $diasem = "lunes";
                } else if ($resto == 2) {
                    $diasem = "martes";
                } else if ($resto == 3) {
                    $diasem = "miércoles";
                } else if ($resto == 4) {
                    $diasem = "jueves";
                } else if ($resto == 5) {
                    $diasem = "viernes";
                } else if ($resto == 6) {
                    $diasem = "sábado";
                } else {
                    $diasem = "domingo";
                }

                //Resultado parcial
                $diasem1 = $diasem;
                $totaldays1 = $totaldays;
            }


            ?>
        </div>

        <div id="fecha2">

            <?php

            if (($paso = "pasa") && isset($day2)) {

                //El paso, sólo pasa cuando está bien la fecha 2 solicitada

                $year = $year2;
                $month = $month2;
                $day = $day2;

                //Calculando la masa inicial de días
                $totaldays = ($year - 1) * 365;

                //Añado los supuestos bisiestos 
                $b = ($year - 1) % 4;
                $totaldays = $totaldays + ($year - $b) / 4;

                //Resto los falsos bisiestos de 100, los años seculares
                $b = ($year - 1) % 100;
                $totaldays = $totaldays - ($year - $b) / 100;

                //Sumo los verdaderos bisiestos de 400 
                $b = ($year - 1) % 400;
                $totaldays = $totaldays + ($year - $b) / 400;

                //Añadir la parte del año en curso
                $yearcur = 0;

                if (($month - 1) == 11) {
                    $yearcur = 334;
                } else if (($month - 1) == 10) {
                    $yearcur = 304;
                } else if (($month - 1) == 9) {
                    $yearcur = 273;
                } else if (($month - 1) == 8) {
                    $yearcur = 243;
                } else if (($month - 1) == 7) {
                    $yearcur = 212;
                } else if (($month - 1) == 6) {
                    $yearcur = 181;  //Los famosos 181 días del primer semestre
                } else if (($month - 1) == 5) {
                    $yearcur = 151;
                } else if (($month - 1) == 4) {
                    $yearcur = 120;
                } else if (($month - 1) == 3) {
                    $yearcur = 90;
                } else if (($month - 1) == 2) {
                    $yearcur = 59;
                } else if (($month - 1) == 1) {
                    $yearcur = 31;
                }

                if (((($year % 4 == 0) && ($year % 100 <> 0)) or (($year % 4 == 0) && ($year % 400 == 0))) && (($month - 1) >= 2)) {
                    $yearcur = $yearcur + 1;
                }

                $yearcur = $yearcur + $day;
                $totaldays = $totaldays + $yearcur;

                //Calcular ya el día de la semana
                $resto = $totaldays % 7;

                if ($resto == 1) {
                    $diasem = "lunes";
                } else if ($resto == 2) {
                    $diasem = "martes";
                } else if ($resto == 3) {
                    $diasem = "miércoles";
                } else if ($resto == 4) {
                    $diasem = "jueves";
                } else if ($resto == 5) {
                    $diasem = "viernes";
                } else if ($resto == 6) {
                    $diasem = "sábado";
                } else {
                    $diasem = "domingo";
                }

                //Resultado parcial
                $diasem2 = $diasem;
                $totaldays2 = $totaldays;
            }


            ?>
        </div>

        <!-- Filtro por no filtrar las fechas en el header -->

        <?php

        if (isset($day1) && isset($day2)) {
            if ($totaldays2 > $totaldays1) {
                $numdays = $totaldays2 - $totaldays1;
            } else {
                $numdays = $totaldays1 - $totaldays2;
            }

            //El echo que te dice el resultado

            echo "<br> Entre el {$diasem1} " . $day1 . " del " . $month1 . " de " . $year1 . " y el {$diasem2} " . $day2 . " del " . $month2 . " de " . $year2 . " hay {$numdays} día";

            if ($numdays > 1) {
                echo "s";
            }
            if ($numdays == 0) {
                echo "s<br> Más que nada porque has puesto la misma fecha en las dos líneas";
            }
        }

        ?>

    </main>


</body>

</html>

103, 104: seinf por las tildes, aunque guardo la versión mala desde el navegador... luego se guarda bien, así que entiendo que el fondo es bueno y el problema sólo de exhibición, al mostrarlo.


Realiza un programa que pida el día de la semana (del 1 al 7) y escriba el día correspondiente. Si introducimos otro número nos da un error.

*************************************

Realiza un programa que pida un número entero entre uno y doce e imprima el número de días que tiene el mes correspondiente.

************************************

Crear un programa que pida cierta cantidad de dinero en euros, y crear un select para seleccionar diferentes divisa (dolar, libras, etc) y el programa haga la conversión euros->divisa seleccionada

*******************************************

Para tributar un determinado impuesto se debe ser mayor de 16 años y tener unos ingresos iguales o superiores a 1000 € mensuales. Escribir un programa que pregunte al usuario su edad y sus ingresos mensuales y muestre por pantalla si el usuario tiene que tributar o no.

**********************************
Los tramos impositivos para la declaración de la renta en un determinado país son los siguientes:

Renta	Tipo impositivo
Menos de 10000€	5%
Entre 10000€ y 20000€	15%
Entre 20000€ y 35000€	20%
Entre 35000€ y 60000€	30%
Más de 60000€	45%
Escribir un programa que pregunte al usuario su renta anual y muestre por pantalla el tipo impositivo que le corresponde.

************************


El director de una escuela está organizando un viaje de estudios y requiere determinar cuánto debe cobrar a cada alumno y cuánto debe pagar a la compañía de viajes por el servicio. La forma de cobrar es la siguiente:
* Si son 100 alumnos o más, el costo por cada alumno es de 65 euros.
* De 50 a 99 alumnos, el costo es de 70 euros.
* De 30 a 49 alumnos, el costo es de 95 euros.
* Menos de 30 alumnos, el costo de la renta del autobús es de 4000 euros, sin importar el número de alumnos.
Realiza un algoritmo que permita determinar el pago a la compañía de autobuses y lo que debe pagar cada alumno por el viaje.


*** Día 05/12/2025

EJERCICIOS 1 A 3, MI PROPUESTA:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Día de la semana</title>
</head>

<body>

    <header>

        <form action="index.php" method="post">

            <input type="number" name="numero" id="numero" placeholder="numero">
            <input type="submit" value="Enviar">

        </form>

    </header>

    <main>

        <br>
        <?php

        $numero = $_POST['numero'];

        switch ($numero) {
            case 1:
                echo "El día 1 de la semana es el lunes";
                break;
            case 2:
                echo "El día 2 de la semana es el martes";
                break;
            case 3:
                echo "El día 3 de la semana es el miércoles";
                break;
            case 4:
                echo "El día 4 de la semana es el jueves";
                break;
            case 5:
                echo "El día 5 de la semana es el viernes";
                break;
            case 6:
                echo "El día 6 de la semana es el sábado";
                break;
            case 7:
                echo "El día 7 de la semana es el domingo";
                break;
            default:
                echo "El número {$numero} no me sirve, la semana sólo tiene siete días";
        }
        ?>

        <a href="ej2.php"> Averigua el número de días de los meses </a>

    </main>





</body>

</html>



<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Días del mes</title>
</head>

<body>

    <header>

        <form action="ej2.php" method="post">
            <h3>Seleciona el mes</h3>
            <select name="mes" multiple>
                <option value="1"> Enero </option>
                <option value="2"> Febrero </option>
                <option value="3"> Marzo </option>
                <option value="4"> Abril </option>
                <option value="5"> Mayo </option>
                <option value="6"> Junio </option>
                <option value="7"> Julio </option>
                <option value="8"> Agosto </option>
                <option value="9"> Septiembre </option>
                <option value="10"> Octubre </option>
                <option value="11"> Noviembre </option>
                <option value="12"> Diciembre </option>
            </select>
            <input type="submit" value="Enviar">

        </form>

    </header>

    <main>

        <br>
        <?php

        $mes = $_POST['mes'];

        if (($mes = 1) or ($mes = 3) or ($mes = 5) or ($mes = 7) or ($mes = 8) or ($mes = 10) or ($mes = 12)) {
            echo "Ese mes tiene 31 días";
        } else if (($mes = 4) or ($mes = 6) or ($mes = 9) or ($mes = 11)) {
            echo "Ese mes tiene 30 días";
        } else {
        echo "Febrero tiene 28 días bastantes veces, 29 los bisiestos y 30 cada muchos años según internet";    
        }


        ?>

        <a href="ej3.php"> Convierta las monedas que le queden </a>

    </main>





</body>

</html>


<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Conversor de monedas</title>
</head>

<body>

    <header>

        <form action="ej2.php" method="post">
            <h3>Introduzca el importe (en euros)</h3>
            <input type="number" name="euro" id="euro" placeholder="Sus euros">
            <h3>Seleciona la divisa a la que convertir</h3>
            <select name="divisa" multiple>
                <option value="1"> Dólar USA </option>
                <option value="2"> Libra inglesa </option>
                <option value="3"> Zloty </option>
                <option value="4"> Pesetas </option>
                <option value="5"> Peso colombiano </option>
                <option value="6"> Peso argentino </option>
                <option value="7"> Yuanes chinos </option>
                <option value="8"> Denario siglo I </option>
            </select>
            <input type="submit" value="Enviar">

        </form>

    </header>

    <main>

        <br>
        <?php

        $euro = $_POST['euro'];
        switch ($_POST['divisa']) {
            case 1:
                $tipcam = 1.17;
                break;
            case 2:
                $tipcam = 0.87;
                break;
            case 3:
                $tipcam = 4.23;
                break;
            case 4:
                $tipcam = 166.386;
                break;
            case 5:
                $tipcam = 4396.50;
                break;
            case 6:
                $tipcam = 1694.36;
                break;
            case 7:
                $tipcam = 8.24;
                break;
            case 8:
                $tipcam = 0.00333;
                break;
        }

        echo "Por {$euro} euros te dan " . $euro * $tipcam . "en moneda local";
        echo "Según información de internet a 04/12/2025. Es decir, una mera orientación";

        if ($_POST['divisa'] = 8) {
            echo "<br>Según blognumismatico.com un denario de Tiberio en calidad media puede rondar los 300 euros. Pensaba que podías sacarle más... ¿y por un sestercio en la aldea gala???";
        }

        ?>

        <a href="ej4.php"> ¿Tienes que tributar en el impuesto misterioso? </a>

    </main>





</body>

</html>



AQUÍ LOS EJERCICIOS:

Realiza un programa que pida el día de la semana (del 1 al 7) y escriba el día correspondiente. Si introducimos otro número nos da un error.

*************************************

Realiza un programa que pida un número entero entre uno y doce e imprima el número de días que tiene el mes correspondiente.

************************************

Crear un programa que pida cierta cantidad de dinero en euros, y crear un select para seleccionar diferentes divisa (dolar, libras, etc) y el programa haga la conversión euros->divisa seleccionada

*******************************************

Para tributar un determinado impuesto se debe ser mayor de 16 años y tener unos ingresos iguales o superiores a 1000 € mensuales. Escribir un programa que pregunte al usuario su edad y sus ingresos mensuales y muestre por pantalla si el usuario tiene que tributar o no.

**********************************
Los tramos impositivos para la declaración de la renta en un determinado país son los siguientes:

Renta	Tipo impositivo
Menos de 10000€	5%
Entre 10000€ y 20000€	15%
Entre 20000€ y 35000€	20%
Entre 35000€ y 60000€	30%
Más de 60000€	45%
Escribir un programa que pregunte al usuario su renta anual y muestre por pantalla el tipo impositivo que le corresponde.

************************


El director de una escuela está organizando un viaje de estudios y requiere determinar cuánto debe cobrar a cada alumno y cuánto debe pagar a la compañía de viajes por el servicio. La forma de cobrar es la siguiente:
* Si son 100 alumnos o más, el costo por cada alumno es de 65 euros.
* De 50 a 99 alumnos, el costo es de 70 euros.
* De 30 a 49 alumnos, el costo es de 95 euros.
* Menos de 30 alumnos, el costo de la renta del autobús es de 4000 euros, sin importar el número de alumnos.
Realiza un algoritmo que permita determinar el pago a la compañía de autobuses y lo que debe pagar cada alumno por el viaje.


Hasta 28 hace un borrado de todo el servidor de Estela desde consola, y luego echo off, tras romper la conexión


EJERCICIO 3, ACTUALIZADO:
<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Conversor de monedas</title>
</head>

<body>

    <header>

        <form action="ej3.php" method="post">
            <h3>Introduzca el importe (en euros)</h3>
            <input type="number" name="euro" id="euro" placeholder="Sus euros">
            <h3>Seleciona la divisa a la que convertir</h3>
            <select name="divisa" multiple>
                <option value="1"> Dólar USA </option>
                <option value="2"> Libra inglesa </option>
                <option value="3"> Zloty </option>
                <option value="4"> Pesetas </option>
                <option value="5"> Peso colombiano </option>
                <option value="6"> Peso argentino </option>
                <option value="7"> Yuanes chinos </option>
                <option value="8"> Denario siglo I </option>
            </select>
            <input type="submit" value="Enviar">

        </form>

    </header>

    <main>

        <br>
        <?php

        $euro = $_POST['euro'];
        switch ($_POST['divisa']) {
            case 1:
                $tipcam = 1.17;
                $texto = "Siempre más o menos cercano a una paridad 1-1";
                break;
            case 2:
                $tipcam = 0.87;
                $texto = "Recuerdo mejores tiempos de la libra ";
                break;
            case 3:
                $tipcam = 4.23;
                $texto = "La moneda del país de Horrífido. Qué perrito más simpático era";
                break;
            case 4:
                $tipcam = 166.386;
                $texto = "Tipo de cambio fijo para toda la eternidad. Respecto al marco alemán lo hicieron más fácil, recordemos";
                break;
            case 5:
                $tipcam = 4396.50;
                $texto = "Colombia, Colón, próxima estación, selva, Uribe... no se me ocurre más, lo siento";
                break;
            case 6:
                $tipcam = 1694.36;
                $texto="Parece que nunca acaban las desdichas económicas de Argentina y de Buenos Aires querido";
                break;
            case 7:
                $tipcam = 8.24;
                $texto="Moneda fuerte, partido fuerte, liderazgo fuerte";
                break;
            case 8:
                $tipcam = 0.00333;
                $texto="Según blognumismatico.com un denario de Tiberio en calidad media puede rondar los 300 euros. Para otros emperadores, épocas y monedas (sestercios, ases...) consultar.";
                break;
        }

        echo "Por {$euro} euros te dan " . $euro * $tipcam . "en moneda local";
        echo "<br>Según información pillada deprisa de internet a 04/12/2025. Es decir, una mera orientación, no vinculante a nivel legal";
        echo "<br> {$texto} <br>";

        ?>

        <a href="ej4.php"> ¿Tienes que tributar en el impuesto misterioso ese inmenso capital que tienes? </a>

    </main>





</body>

</html>


EJERCICIO 4:
Para tributar un determinado impuesto se debe ser mayor de 16 años y tener unos ingresos iguales o superiores a 1000 € mensuales. Escribir un programa que pregunte al usuario su edad y sus ingresos mensuales y muestre por pantalla si el usuario tiene que tributar o no.

PROPUESTA DE PRIMERA MANO:
<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> Tributar en el impuesto </title>
</head>

<body>

    <header>

        <form action="ej4.php" method="post">
            <h3>Gobierno de País. Introcuce edad e ingresos mensuales</h3>
            <input type="number" name="edad" id="edad" placeholder="Edad" min=1 max=150 step=1>
            <input type="number" name="ingresos" id="ingresos" placeholder="Ingresos mensuales" min=0 step=0.01>
            <input type="submit" value="Enviar">
        </form>

    </header>

    <main>

        <br>
        <?php

        if (isset($_POST['edad']) && isset($_POST['ingresos']) && ($_POST['edad'] > 16) and ($_POST['ingresos'] >= 1000)) {

            echo "<br>Paisano, el gobierno de País te felicita por pagar por el bien de otros paisanos<br>";
        } else {
            echo "<br>Paisano, el gobierno de País se entristece por tu situación. Solicita ayudas en nuestra Central de Ayudas (no pulse aquí)<br>";
        }
        ?>


        <a href="ej5.php"> Ahora te digo lo que te toca pagar. Pincha, pincha y descubre, campeón </a>

    </main>


</body>

</html>


EJERCICIO 5 DE 6:
Los tramos impositivos para la declaración de la renta en un determinado país son los siguientes:

Renta	Tipo impositivo
Menos de 10000€	5%
Entre 10000€ y 20000€	15%
Entre 20000€ y 35000€	20%
Entre 35000€ y 60000€	30%
Más de 60000€	45%
Escribir un programa que pregunte al usuario su renta anual y muestre por pantalla el tipo impositivo que le corresponde.

PROPUESTA INICIAL (me quedaría pasarle por input hidden la renta del otro ejercicio, por ejemplo. Y por supuesto probar toda la cadena):
<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Tipo del impuesto</title>
</head>

<body>

    <header>

        <form action="ej5.php" method="post">
            <h3>Introduzca su renta anual (en euros)</h3>
            <input type="number" name="euro" id="euro" placeholder="Sus euros" min=0 step=0.01>
            <input type="submit" value="Enviar">

        </form>

    </header>

    <main>

        <br>
        <?php

        if ($_POST['euro'] < 10000) {
            $tipo = 5;
        } else if (($_POST['euro'] <= 10000) && ($_POST['euro'] < 20000)) {
            $tipo = 15;
        } else if (($_POST['euro'] <= 20000) && ($_POST['euro'] < 35000)) {
            $tipo = 20;
        } else if (($_POST['euro'] <= 35000) && ($_POST['euro'] <= 60000)) {
            $tipo = 30;
        } else if ($_POST['euro'] > 60000) {
            $tipo = 45;
        } else {
            echo "Introduzca un valor válido en la casilla superior";
        }

        if (isset($tipo)) {
            echo "<br> Se le aplicará un tipo impositivo del {$tipo}%";
            echo "<br> Su cuota a pagar es de " . $_POST['euro'] * $tipo . " euros.<br>";
        }


        ?>

        <p>Y encima también a pagar la excursión del niño al Museo de la Democracia, si a Franco ya le ve en la tele los viernes noche, brr...</p><br>
        <a href="ej6.php"> Consulta el precio aquí </a> <p> (redacción posterior no incluida) </p>

        <br><br> <p> Ánimo, paisano conciudadano, ya te queda poco</p>

    </main>


</body>

</html>


EJERCICIO 6:
El director de una escuela está organizando un viaje de estudios y requiere determinar cuánto debe cobrar a cada alumno y cuánto debe pagar a la compañía de viajes por el servicio. La forma de cobrar es la siguiente:
* Si son 100 alumnos o más, el costo por cada alumno es de 65 euros.
* De 50 a 99 alumnos, el costo es de 70 euros.
* De 30 a 49 alumnos, el costo es de 95 euros.
* Menos de 30 alumnos, el costo de la renta del autobús es de 4000 euros, sin importar el número de alumnos.
Realiza un algoritmo que permita determinar el pago a la compañía de autobuses y lo que debe pagar cada alumno por el viaje.


PROPUESTA INICIAL:
<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Viaje del niño</title>
</head>

<body>

    <header>

        <form action="ej6.php" method="post">
            <h3>Introduzca el número de niños que viajan (en niños)</h3>
            <input type="number" name="nenes" id="nenes" placeholder="Número alumnos" min=1 step=1>
            <input type="submit" value="Enviar">

        </form>

    </header>

    <main>

        <br>
        <?php

        if ($_POST['nenes'] >= 100) {
            $precio = 65;
        } else if (($_POST['nenes'] >= 50) && ($_POST['nenes'] <= 99)) {
            $precio = 70;
        } else if (($_POST['nenes'] >= 30) && ($_POST['nenes'] <= 49)) {
            $precio = 95;
        } else if ($_POST['nenes'] < 30) {
            $precio = 4000 / $_POST['nenes'];
        } else {
            echo "Introduzca un valor válido en la casilla superior, haga el favor";
        }

        if (isset($precio)) {
            echo "<br> Pago a la compañía de autobuses (coste total del viaje): " . $precio * $_POST['nenes'] . " euros";
            echo "<br> Precio a pagar por cada alumno vandálico de los suyos: " . $precio . " euros.<br>";
        }

        ?>

        <p> Si está interesado en pagar en otra divisa (no cripto), </p>
        <a href="ej3.php"> pinche aquí </a>
        <br><br>
        <p> (No lo intente en pesetas o denarios. Obligatorio mediante transferencia verificada por Verifactu y con IBAN español. Se aplicarán términos y condiciones) </p>

        <br><br>
        <h2> THE END.</h2>
        <p> And the winnidipí. Y el wannabe, amigo Sancho</p>
        <!--         Círculo que se cierra mientras ambos viajan reposados y distendidos por La Mancha, la Talavera cervantina, y luego títulos de crédito. Executive Producer Yo, obviamente (otra cosa es quién sea yo aquí (tilde complicada la quienera))
        (Lentines no, señor Frodo, sólo reposados, que es otra palabra. En la Tierra Media mucho noldor y mucho silmaril pero ya les cae antiguo Cervantes autor (no de esto)) -->

    </main>


</body>

</html>



56: https://www.php.net/manual/es/reserved.variables.post.php
… asumiendo que el usuario envió una solicitud POST con name=Hannes en el cuerpo.


php/if/deltxt/ej6.php

110 a 116: tengo que corregir esos temas de if...else con un isset, para que no salgan solos antes de meterle los datos en el input
(114 era un tema de upload folder nada más)


*** Día 09/12/2025


https://us06web.zoom.us/j/86503414802

48: el bloque marcado hace más o menos lo mismo

49: bucles
50: foreach es un bucle especializado que permite recorrer arrays
51: dibujito sobre el break

Luego tenemos ejemplos de WHILE

71: DO WHILE evalúa la condición al final en vez de al principio, así que el bucle siempre se ejecuta una vez, se cumpla o no la condición (en este ejemplo tendría sentido el while, no el do-while)

Suele tener más sentido el while que el do-while

83: FOR, que es más rápido que while porque no evalúa a cada vuelta

88: este FOR va de 0 a 10
93: en este caso suma 2 a cada vuelta, pero no tiene sentido hacerlo así

98, 99: sólo imprime los múltiplos de 5 pares. 100 imprime los impares.

continue rompe esa iteración del bloque for, sacando sólo los impares (102). Lo que queda por debajo del continue se desprecia y el bucle pasa a la siguiente vuelta. El break rompe totalmente el bucle (105, 106)


EJERCICIOS:
1. uno de IF para pasar a números romanos un valor de 1 hasta 3999 (sin funciones, pero si acaso bucles)
2. valores de 1 a 1000 múltiplos de 3, ya con bucles
3. yendo del 1 al 100 separar pares e impares, mostrarlos y su suma
4. pedir número de alumnos y que cree un formulario para poner las notas de cada alumno, y que luego te calcule la media (117 a 120)
5. mejorar el de la carne, para que el número de carnes/partidos nos lo pida al principio


PROPUESTA SIN PROBAR DE 1:
<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Números romanos</title>
    <link rel="stylesheet" href="style.css">
</head>

<body>

    <header>

        <form action="index.php" method="post">
            <input type="number" name="numero" id="numero" min=1 max=3999 step=1>
            <input type="submit" value="Enviar">
        </form>

        <?php
        $numero = $_POST['numero'];
        $resto = $numero;
        ?>


    </header>

    <main>

        <?php

        echo "<br> El número {$numero} en números romanos se escribía ";

        if ($resto >= 1000) {
            $numletras = intdiv($resto, 1000);
            for ($i = 0; $i < $numletras; $i++) {
                echo "M";
            }
            $resto = $resto - $numletras * 1000;
        }

        if ($resto >= 900) {
            echo "CM";
            $resto = $resto - 900;
        }

        if ($resto >= 500) {
            echo "D";
            $resto = $resto - 500;
        }

        if ($resto >= 400) {
            echo "CD";
            $resto = $resto - 400;
        }


        if ($resto >= 100) {
            $numletras = intdiv($resto, 100);
            for ($i = 0; $i < $numletras; $i++) {
                echo "C";
            }
            $resto = $resto - $numletras * 100;
        }
        if ($resto >= 90) {
            echo "XC";
            $resto = $resto - 900;
        }

        if ($resto >= 50) {
            echo "L";
            $resto = $resto - 500;
        }

        if ($resto >= 40) {
            echo "XL";
            $resto = $resto - 400;
        }

        if ($resto >= 10) {
            $numletras = intdiv($resto, 10);
            for ($i = 0; $i < $numletras; $i++) {
                echo "X";
            }
            $resto = $resto - $numletras * 10;
        }
        if ($resto >= 9) {
            echo "IX";
            $resto = $resto - 9;
        }

        if ($resto >= 5) {
            echo "V";
            $resto = $resto - 5;
        }

        if ($resto >= 4) {
            echo "IV";
            $resto = $resto - 4;
        }

        if ($resto >= 1) {
            $numletras = intdiv($resto, 1);
            for ($i = 0; $i < $numletras; $i++) {
                echo "I";
            }
            $resto = $resto - $numletras;
        }

        if ($resto > 1) {
            echo "<br>Algo falla, por aquí sobra algo";
        }


        ?>




    </main>


    <br> <a href="../../../index.html"> Página principal </a>

</body>

</html>



2. valores de 1 a 1000 múltiplos de 3, ya con bucles

PROPUESTA SIN PROBAR DE 2:
<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Múltiplos de 3</title>
</head>

<body>

    <main>

        <?php

        echo "Primeros números múltiplos de 3:<br>";

        for ($i = 3; $i < 1001; $i += 3) {
            echo $i.", ";
        }

        ?>

    </main>




</body>

</html>


3. yendo del 1 al 100 separar pares e impares, mostrarlos y su suma

PROPUESTA SIN PROBAR DE 3:
<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Pares e impares</title>
</head>

<body>

    <main>

        <?php

        $totalpares = 0;
        $totalimpares = 0;
        echo "<br>Números pares: ";

        for ($i = 2; $i < 101; $i += 2) {
            echo $i . ", ";
            $totalpares = $totalpares + $i;
        }

        echo "que da un total de ". $totalpares;

        echo "<br>Números impares: ";
        for ($i = 1; $i < 101; $i += 2) {
            echo $i . ", ";
            $totalimpares = $totalimpares + $i;
        }

        echo "que da un total de ". $totalimpares;


        ?>

    </main>




</body>

</html>


4. pedir número de alumnos y que cree un formulario para poner las notas de cada alumno, y que luego te calcule la media (117 a 120)
5. mejorar el de la carne, para que el número de carnes/partidos nos lo pida al principio

PROPUESTA SIN PROBAR DE 4:
<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Nota media</title>
</head>

<body>

    <header>

        <!-- 4. pedir número de alumnos y que cree un formulario para poner las notas de cada alumno, y que luego te calcule la media -->

        <form action="index.php" method="post">
            <input type="number" name="numero" id="numero" placeholder="Número de alumnos">
            <input type="submit" value="Enviar">
        </form>


    </header>

    <main>

        <form action="index.php" method="post">

            <?php
            for ($i = 0; $i < $_POST['numero']; $i++) {
            ?>
                <input type="number" name="nota<?php echo $i; ?>" id="nota<?php echo $i; ?>" placeholder="Nota">
            <?php
            }
            ?>
            <input type="submit" value="Enviar">
        </form>

        <?php
        $total = 0;
        for ($i = 0; $i < $_POST['numero']; $i++) {
        $total=$total + $_POST['nota$i'];
        }
        $media=$total/$_POST['numero'];
        echo "<br><br>La nota media de este grupo es {$media}";
        ?>


    </main>



</body>

</html>

… me queda la duda de si esa expresión de $total=$total + $_POST['nota$i'] está bien o no

Busco en Google "puedo añadir variables en el name de un $_post?"

En PHP, el atributo name de un campo de formulario HTML sí puede contener una estructura que PHP interpretará como un array, pero no puedes poner directamente variables PHP dentro del name en el HTML, porque el HTML se envía al navegador y este no interpreta PHP.

1️⃣ Lo que sí puedes hacer
Puedes usar sintaxis de arrays en el name para que $_POST lo reciba como un array asociativo o numérico.
Ejemplo:
Html<form method="post">
    <input type="text" name="usuario[nombre]" value="Juan">
    <input type="text" name="usuario[edad]" value="30">
    <button type="submit">Enviar</button>
</form>

En PHP:
Php<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    print_r($_POST['usuario']);
    // Resultado:
    // Array
    // (
    //     [nombre] => Juan
    //     [edad] => 30
    // )
}
?>


2️⃣ Lo que no puedes hacer directamente
No puedes escribir algo como:
Html<input type="text" name="<?php $var = 'dato'; echo $var; ?>">

y esperar que funcione a menos que el archivo sea procesado por PHP antes de enviarse al navegador.
Si el archivo es .php y el código PHP se ejecuta, entonces sí puedes generar dinámicamente el name:
Php<?php $var = 'dato'; ?>
<input type="text" name="campo_<?php echo $var; ?>">

Esto enviará algo como:
Php$_POST['campo_dato']


3️⃣ Resumen

✅ Puedes usar arrays en el name (campo[subcampo]) para agrupar datos.
✅ Puedes generar dinámicamente el name con PHP antes de enviar el HTML.
❌ No puedes poner variables PHP directamente en el name si el archivo no es procesado por PHP.
✅ Puedes acceder a los datos en $_POST usando la misma estructura que definiste en el name.


Si quieres, puedo prepararte un ejemplo completo donde el name se construya dinámicamente y $_POST lo procese como array.
¿Quieres que te lo haga?




ALEJANDRO GARCIA ARIAS 12:54
https://alejandro.avisando.com/php/if/conversorromanos/index.php

JOSE MARIA VELASCO GUERRERO 14:40
https://jose.avisando.com/php/if/numeroromano/index.php

MARCOS MARTIN LARA 14:41
https://marcos.avisando.com/php/romanos/index.php


169: me faltaría calibrar lo del isset
171 falla... por lo de 170. Lo veo, me falta corregir números

Quedan por meter en la página principal
Los 3 ejercicios sobre fechas
Los "deltxt"
Los de este bloque
Revisar si no me dejo nada

172: aparentemente corregido por 173. Transcribo aquí el código modificado:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Números romanos</title>
    <link rel="stylesheet" href="style.css">
</head>

<body>

    <header>

        <form action="index.php" method="post">
            <input type="number" name="numero" id="numero" min=1 max=3999 step=1>
            <input type="submit" value="Enviar">
        </form>

        <?php
        $numero = $_POST['numero'];
        $resto = $numero;
        ?>


    </header>

    <main>

        <?php

        echo "<br> El número {$numero} en números romanos se escribía ";

        if ($resto >= 1000) {
            $numletras = intdiv($resto, 1000);
            for ($i = 0; $i < $numletras; $i++) {
                echo "M";
            }
            $resto = $resto - $numletras * 1000;
        }

        if ($resto >= 900) {
            echo "CM";
            $resto = $resto - 900;
        }

        if ($resto >= 500) {
            echo "D";
            $resto = $resto - 500;
        }

        if ($resto >= 400) {
            echo "CD";
            $resto = $resto - 400;
        }


        if ($resto >= 100) {
            $numletras = intdiv($resto, 100);
            for ($i = 0; $i < $numletras; $i++) {
                echo "C";
            }
            $resto = $resto - $numletras * 100;
        }
        if ($resto >= 90) {
            echo "XC";
            $resto = $resto - 90;
        }

        if ($resto >= 50) {
            echo "L";
            $resto = $resto - 50;
        }

        if ($resto >= 40) {
            echo "XL";
            $resto = $resto - 40;
        }

        if ($resto >= 10) {
            $numletras = intdiv($resto, 10);
            for ($i = 0; $i < $numletras; $i++) {
                echo "X";
            }
            $resto = $resto - $numletras * 10;
        }
        if ($resto >= 9) {
            echo "IX";
            $resto = $resto - 9;
        }

        if ($resto >= 5) {
            echo "V";
            $resto = $resto - 5;
        }

        if ($resto >= 4) {
            echo "IV";
            $resto = $resto - 4;
        }

        if ($resto >= 1) {
            $numletras = intdiv($resto, 1);
            for ($i = 0; $i < $numletras; $i++) {
                echo "I";
            }
            $resto = $resto - $numletras;
        }

        if ($resto > 1) {
            echo "<br>Algo falla, por aquí sobra algo";
        }


        ?>




    </main>


    <br> <a href="../../../index.html"> Página principal </a>

</body>

</html>


*** Día 10/12/2025

USB-3 es de lengüeta azul
USB normal es de lengüeta negra


JAVIER
Imc con imágenes | Descargar
Cuadernillo Rubio Sumas | Descargar
Cuadernillo Rubio Sumas Mejora con bucles y arrays (Adelanto) | Descargar
Cajero | Descargar
Cajero Mejorado | Descargar
Día de la Semana | Descargar
Día de la Semana Mejorado | Descargar

YO
IMC ampliado Descargar
Cuaderno Rubio con las 4 reglas Descargar
Cajero repartidor de cambio Descargar
FALTAN:
Los 3 de días
Los de "deltxt"
Los 5 del 09/12/2025



En VS Code al pulsar intro en la línea del cuadrado es cuando sale la estructura del FOR

11 a 13 por la expresión de la suma
$i+=2 suma 2
$total+=$i es por $total=$total+$i
$i++ suma 1

20: 01/01/1970 es el inicio de la era informática para el ordenador. Time devuelve la cantidad de segundos desde entonces

https://www.php.net/manual/es/function.time.php
time — Devuelve el timestamp UNIX actual

36 es un ejemplo de bucle infinito... No, es 45
No ejecutar 38, es una forma de llenar el disco duro
No pararía con ^C porque va del lado del servidor. Por suerte en PHP nos puede limitar el tiempo de ejecución de un script y el tamaño que podemos ocupar, en C o Python no podría
40 crea cada vez un fichero... y tal vez me valga para mi problema de ayer


Hasta 56 está con el Terminal de VS Code. Elimina el contenido del servidor y vuelve a subir la carpeta desde local

66: tenemos marcado ver los errores
72: se almacenan los log de diferentes días
Si se llena el disco duro... denegación de servicio

De 74 a 76 vemos que hay una rotación, que por tamaño o fechas se comprime el archivo existente y se genera otro, y sólo habrá un número concreto de archivos

78 es otro bucle infinito, esta vez con while

http://javier.avisando.com/php/bucles/paresimpares/sexogratis.html

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Te invitamos a algo</title>
</head>

<body>

    <script>
        var contador = 1
        function tejodes() {
            while (true) {
                alert("Eres un vicioso/a nivel: " + contador);
                contador++;
            }
        }
    </script>

    <button onclick="tejodes()">Sexo Gratis para tod@s</button>
</body>

</html>


Lo anterior es en JS, es 86
87: concatena con un + en vez de .
88 es un bucle infinito sin tener bucles, es una función de retrollamada
94: excedido el tamaño máximo de petición, se está llenando poco a poco la memoria RAM con peticiones pendientes

Podemos expresarlo como 103 o como 104
Modelo de ejecución: 107 sustituye a 106 tras completar el formulario, es una forma de CLS



MODIFICACIÓN DEL EJERCICIO 4:
<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Nota media</title>
</head>

<body>

    <header>

        <!-- 4. pedir número de alumnos y que cree un formulario para poner las notas de cada alumno, y que luego te calcule la media -->

        <form action="index.php" method="post">
            <input type="number" name="numero" id="numero" placeholder="Número de alumnos">
            <input type="submit" value="Enviar">
        </form>


    </header>

    <main>

        <form action="index.php" method="post">

            <?php
            for ($i = 0; $i < $_POST['numero']; $i++) {
            ?>
                <input type="number" name="nota<?php echo $i; ?>" id="nota<?php echo $i; ?>" placeholder="Nota">
            <?php
            }
            ?>
            <input type="submit" value="Enviar">
        </form>

        <?php
        $total = 0;
        for ($i = 0; $i < $_POST['numero']; $i++) {
        $total=$total + $_POST['nota'.$i];
        }
        $media=$total/$_POST['numero'];
        echo "<br><br>La nota media de este grupo es {$media}";
        ?>


    </main>



</body>

</html>


Cambio efectuado por Alfonso, se corrige la notación (la correcta es la inferior):

        $total=$total + $_POST['nota$i'];

        $total=$total + $_POST['nota'.$i];


De los de ayer queda este:
5. mejorar el de la carne, para que el número de carnes/partidos nos lo pida al principio
Y como es lógico comienzo copiando mi proyecto inacabado de las carnes

PRIMER ESBOZO, EN 114 Y SIN PROBAR:
<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Gráfica política</title>
    <link rel="stylesheet" href="style.css">
</head>

<body>

    <header>
        <h1> Selección de partidos y colores </h1>

        <form action="index.php" method="post">
            <input type="number" name="numero" placeholder="Número de partidos" min=2 required>
            <input type="submit" value="Enviar">
        </form>

    </header>


    <main>

        <?php

        $total = 0;
        if (isset($_POST['numero'])) {

        ?>

            <form action="index.php" method="post">
                <fieldset>

                    <legend> Datos </legend>

                    <section id="datos">

                        <?php
                        for ($i = 0; $i < $_POST['numero']; $i++) {
                        ?>

                            <div>
                                <h3> Partidos </h3>

                                <input type="text" name="partido<?php echo $i; ?>" minlength="2" required>

                            </div>

                            <div>
                                <h3> Número de votos </h3>

                                <input type="number" name="votos<?php echo $i; ?>" step=1 required>

                            </div>

                            <div>
                                <h3> Color en la gráfica </h3>

                                <input type="color" name="color<?php echo $i; ?>" required>

                            </div>
                        <?php
                        }
                        ?>
                    </section>
                    <input type="submit" value="Enviar">

                </fieldset>

            </form>

            <?php

            for ($i = 0; $i < $_POST['numero']; $i++) {
                $total += $_POST['votos' . $i];
            }
        }


        if ($total <> 0) {

            for ($i = 0; $i < $_POST['numero']; $i++) {
                $porcentaje . $i = $_POST['votos' . $i] / $total;
            }

            ?>

            <section id="grafica">

                <?php
                for ($i = 0; $i < $_POST['numero']; $i++) {
                ?>
                    <div>
                        <?php
                        echo $_POST['partido' . $i] . "   " . $_POST['votos' . $i];
                        ?>
                    </div>
                <?php
                }

                ?>

            </section>

        <?php
        }

        ?>

    </main>

    <br> <a href="../../index.html"> Página principal </a>



</body>

</html>


Y SU CSS:

/* root {
--porcentaje1: $porcentaje1;
--porcentaje2: $porcentaje2;
--porcentaje3: $porcentaje3;
--porcentaje4: $porcentaje4;
--color1: S_POST["color1"];
--color2: S_POST["color2"];
--color3: S_POST["color3"];
--color4: S_POST["color4"];
} */


#datos{
display: grid;
grid-template-columns: 3fr 3fr 1f;
}

#datos input{
justify-items: center;
}

#grafica{
display: grid;
}


/* 
#grafica php>echo:nth-child(1){
height: var(--porcentaje1)*100px;
background-color: var(--color1);

}

#grafica php>echo:nth-child(2){
height: var(--porcentaje2)*100px;
background-color: var(--color2);
}

#grafica php>echo:nth-child(3){
height: var(--porcentaje3)*100px;
background-color: var(--color3);
}

#grafica php>echo:nth-child(4){
height: var(--porcentaje4)*100px;
background-color: var(--color4);
}

 */


*** Día 11/12/2025

VNC Viewer, lo que usa el Epoptes
(Lo veo en un Alt+Tab cuando nos conecta justo cuando estaba entrando en Debian y VS Code)


Extracciones de la parte de carnicería, lo que me llama la atención:
A nivel archivo PHP:

<?php
        $porcentaje = $_POST['facturado_' . $contador] * 100 / $total;
        ?>
        <div style="background-color: <?php echo $_POST['color_' . $contador]; ?>; height: <?php echo $porcentaje * 1.5 ?>vh;"><p><?php echo $_POST['producto_' . $contador++] . " " . round($porcentaje, 2) . "%"; ?></p></div>


A nivel del llamado style.php, no vinculado al PHP:

<?php
$contador = 1;
$porcentaje = 0;
$total = $_POST['facturado_1'] + $_POST['facturado_2'] + $_POST['facturado_3'] +  $_POST['facturado_4'];
?>

main>div:nth-child[<?php echo $contador; ?>]{
    background-color: <?php echo $_POST['color_' . $contador]; ?>;
    height: <?php echo $porcentaje * 1.5 ?>vh;
}


Parece que Copilot es la mejor IA para programación

En C, Java, Python sí podemos montar un depurador paso a paso, o en JS, pero en PHP no porque es del lado del servidor y habría que montar un cirio con un servidor aparte e irlo viendo

Volviendo al programa, ya tengo los esbozos de las dos formas (con los estilos en el index y en el style, respectivamente) sin probar

- MODALIDAD 1 (con los estilos en el index)
En php/bucles/partidos2

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Gráfica política</title>
    <link rel="stylesheet" href="style.css">
</head>

<body>

    <header>
        <h1> Selección de partidos y colores </h1>

        <form action="index.php" method="post">
            <input type="number" name="numero" placeholder="Número de partidos" min=2 required>
            <input type="submit" value="Enviar">
        </form>

    </header>


    <main>

        <?php

        $total = 0;
        if (isset($_POST['numero'])) {

        ?>

            <form action="index.php" method="post">
                <fieldset>

                    <legend> Datos </legend>

                    <section id="datos">

                        <?php
                        for ($i = 0; $i < $_POST['numero']; $i++) {
                        ?>

                            <div>
                                <h3> Partidos </h3>

                                <input type="text" name="partido<?php echo $i; ?>" minlength="2" required>

                            </div>

                            <div>
                                <h3> Número de votos </h3>

                                <input type="number" name="votos<?php echo $i; ?>" step=1 required>

                            </div>

                            <div>
                                <h3> Color en la gráfica </h3>

                                <input type="color" name="color<?php echo $i; ?>" required>

                            </div>
                        <?php
                        }
                        ?>
                    </section>
                    <input type="submit" value="Enviar">

                </fieldset>

            </form>

            <?php

            for ($i = 0; $i < $_POST['numero']; $i++) {
                $total += $_POST['votos' . $i];
            }
        }


        if ($total <> 0) {

            for ($i = 0; $i < $_POST['numero']; $i++) {
                $porcentaje . $i = $_POST['votos' . $i] *100 / $total;
            }

            ?>

            <section id="grafica">

                <?php
                for ($i = 0; $i < $_POST['numero']; $i++) {
                ?>

                        <div style="background-color: <?php echo $_POST['color' . $i]; ?>; height: <?php echo $porcentaje. $i * 1.5 ?>vh;">
                            <p><?php echo $_POST['partido' . $i] . " " . round($porcentaje.$i, 2) . "%"; ?></p>
                        </div>
                <?php

                }

                ?>

            </section>

        <?php
        }

        ?>

    </main>

    <br> <a href="../../index.html"> Página principal </a>



</body>

</html>




#datos{
display: grid;
grid-template-columns: 3fr 3fr 1f;
}

#datos input{
justify-items: center;
}

#grafica{
display: grid;
}




- MODALIDAD 2 (con los estilos en el style, reextensionado como PHP):

En php/bucles/partidos3

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Gráfica política</title>
    <link rel="stylesheet" href="style.php">
</head>

<body>

    <header>
        <h1> Selección de partidos y colores </h1>

        <form action="index.php" method="post">
            <input type="number" name="numero" placeholder="Número de partidos" min=2 required>
            <input type="submit" value="Enviar">
        </form>

    </header>


    <main>

        <?php

        $total = 0;
        if (isset($_POST['numero'])) {

        ?>

            <form action="index.php" method="post">
                <fieldset>

                    <legend> Datos </legend>

                    <section id="datos">

                        <?php
                        for ($i = 0; $i < $_POST['numero']; $i++) {
                        ?>

                            <div>
                                <h3> Partidos </h3>

                                <input type="text" name="partido<?php echo $i; ?>" minlength="2" required>

                            </div>

                            <div>
                                <h3> Número de votos </h3>

                                <input type="number" name="votos<?php echo $i; ?>" step=1 required>

                            </div>

                            <div>
                                <h3> Color en la gráfica </h3>

                                <input type="color" name="color<?php echo $i; ?>" required>

                            </div>
                        <?php
                        }
                        ?>
                    </section>
                    <input type="submit" value="Enviar">

                </fieldset>

            </form>

            <?php

            for ($i = 0; $i < $_POST['numero']; $i++) {
                $total += $_POST['votos' . $i];
            }
        }


        if ($total <> 0) {

            for ($i = 0; $i < $_POST['numero']; $i++) {
                $porcentaje . $i = $_POST['votos' . $i] / $total;
            }

            ?>

            <section id="grafica">

                <?php
                for ($i = 0; $i < $_POST['numero']; $i++) {
                ?>
                    <div>
                        <?php
                        echo $_POST['partido' . $i] . "   " . $_POST['votos' . $i];
                        ?>
                    </div>
                <?php
                }

                ?>

            </section>

        <?php
        }

        ?>

    </main>

    <br> <a href="../../index.html"> Página principal </a>



</body>

</html>


/* root {
--porcentaje1: $porcentaje1;
--porcentaje2: $porcentaje2;
--porcentaje3: $porcentaje3;
--porcentaje4: $porcentaje4;
--color1: S_POST["color1"];
--color2: S_POST["color2"];
--color3: S_POST["color3"];
--color4: S_POST["color4"];
} */


#datos{
display: grid;
grid-template-columns: 3fr 3fr 1f;
}

#datos input{
justify-items: center;
}

#grafica{
display: grid;
}

<?php

for ($i = 0; $i < $_POST['numero']; $i++) {
    $total += $_POST['votos' . $i];
}

?>

<?php
for ($i = 0; $i < $_POST['numero']; $i++) {
?>

    #grafica>div:nth-child[<?php echo $i; ?>]{
    background-color: <?php echo $_POST['color' . $i]; ?>;
    height: <?php echo $porcentaje . $i * 1.5 ?>vh;
    }

<?php
}
?>


42 a 48: ah, fabuloso: resulta que ninguno de los dos programas hace nada. Eso sí, en el primero te deja centrado lo que escribes

49, 50: no suma el total
51, 52: pero sí coge los votos, me pinta echo $_POST['votos1'];. Es decir, funciona lo de <input type="number" name="votos<?php echo $i; ?>" step=1 required>

Y parece que también funciona esto...
$i=2;
echo $_POST['votos'.$i];

Entonces, ¿por qué no quiere hacerme caso lo de $total += $_POST['votos' . $i];??
... tal vez sea por ese $total = 0; que veo en 53. En Basic me serviría sin duda (pienso), pero tal vez aquí se reejecute todo al completar el formulario y... Si esta teoría es cierta habría que meter esa línea dentro del if (isset($_POST['numero'])). Y entonces tal vez el segundo if (el de if ($total <> 0)) pasaría a ser también de isset, por el warning que me sale.


Veamos... 57. Sí, voy a meterle el isset al segundo if

Y sigue igual, así que Copilot me dice que use arrays en $porcentaje


<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Gráfica política</title>
    <link rel="stylesheet" href="style.css">
</head>

<body>

    <header>
        <h1> Selección de partidos y colores </h1>

        <form action="index.php" method="post">
            <input type="number" name="numero" placeholder="Número de partidos" min=2 required>
            <input type="submit" value="Enviar">
        </form>

    </header>


    <main>

        <?php

        if (isset($_POST['numero'])) {
            $total = 0;

        ?>

            <form action="index.php" method="post">
                <fieldset>

                    <legend> Datos </legend>

                    <section id="datos">

                        <?php
                        for ($i = 0; $i < $_POST['numero']; $i++) {
                        ?>

                            <div>
                                <h3> Nombre del partido </h3>
                                <input type="text" name="partido<?php echo $i; ?>" minlength="2" required>
                            </div>

                            <div>
                                <h3> Número de votos </h3>
                                <input type="number" name="votos<?php echo $i; ?>" step=1 required>
                            </div>

                            <div>
                                <h3> Color en la gráfica </h3>
                                <input type="color" name="color<?php echo $i; ?>" required>
                            </div>
                        <?php
                        }
                        ?>
                    </section>
                    <input type="submit" value="Enviar">

                </fieldset>

            </form>

            <?php

            for ($i = 0; $i < $_POST['numero']; $i++) {
                $total += $_POST['votos' . $i];
            }
        }

        if (isset($total)) {

            // Usamos un array para los porcentajes
            $porcentaje = [];

            for ($i = 0; $i < $_POST['numero']; $i++) {
                $porcentaje[$i] = $_POST['votos' . $i] * 100 / $total;
            }

            ?>

            <section id="grafica">

                <?php
                for ($i = 0; $i < $_POST['numero']; $i++) {
                ?>
                    <div style="background-color: <?php echo $_POST['color' . $i]; ?>; height: <?php echo $porcentaje[$i] * 1.5 ?>vh;">
                        <p><?php echo $_POST['partido' . $i] . " " . round($porcentaje[$i], 2) . "%"; ?></p>
                    </div>
                <?php
                }
                ?>

            </section>

        <?php
        }

        ?>

    </main>

    <br> <a href="../../index.html"> Página principal </a>

</body>

</html>

... le meto este código y lo mismo, tampoco me funciona Copilot aquí, aunque me copio su siguiente propuesta:

/* style.css */

body {
    font-family: Arial, sans-serif;
    margin: 20px;
    background-color: #f5f5f5;
}

header {
    text-align: center;
    margin-bottom: 30px;
}

form {
    margin: 15px 0;
}

fieldset {
    border: 2px solid #333;
    padding: 15px;
    border-radius: 8px;
    background-color: #fff;
}

#datos div {
    margin-bottom: 15px;
}

#grafica {
    display: flex;
    align-items: flex-end; /* barras alineadas abajo */
    gap: 10px;
    margin-top: 30px;
    height: 60vh; /* altura máxima del contenedor */
    border: 1px solid #ccc;
    padding: 10px;
    background-color: #fff;
}

#grafica div {
    flex: 1; /* todas las barras con el mismo ancho */
    display: flex;
    align-items: flex-end;
    justify-content: center;
    color: #fff;
    font-weight: bold;
    border-radius: 5px 5px 0 0;
    transition: transform 0.3s;
}

#grafica div:hover {
    transform: scale(1.05); /* efecto al pasar el ratón */
}



Qué hace este CSS:
📊 Flexbox en #grafica para que las barras se coloquen una al lado de la otra.

🎨 Cada barra (#grafica div) se ajusta en ancho automáticamente y se alinea abajo.

✨ Se añade un efecto hover para que la barra se agrande un poco al pasar el ratón.

🖼️ Fondo blanco y bordes redondeados para que se vea más limpio.

Con esto, tu gráfica se verá como un gráfico de barras verticales con colores personalizados y porcentajes visibles.


Y ya de paso, comentarios:

HTML
<!-- Esto es un comentario en HTML -->
<div>Contenido visible</div>

PHP
<?php
// Comentario de una sola línea

# También válido para una sola línea

/*
   Comentario de varias líneas
   que puede abarcar más texto
*/
?>

Unidos HTML y PHP hay que jugar con ambos formatos:
<?php
// Comentario PHP dentro del bloque
echo "<p>Hola mundo</p>"; // comentario al final de línea
?>

<!-- Comentario HTML fuera del bloque PHP -->
<p>Esto se verá en la página</p>


👉 Regla práctica:

Dentro de <?php ... ?> → usa //, # o /* ... */.

Fuera de PHP → usa <!-- ... -->.


*** Día 12/12/2025


https://www.netveloper.com/instalacion-de-un-entorno-LAMP-en-windows-con-XAMPP
Es para la instalación de VS Code en entorno Windows
(Cuidado en este caso, que los atajos de teclado son diferentes)

40: cada carpeta es un proyecto. Incluso puedes tener dos Visual abiertos, cada uno con un proyecto (45)


Al final, al llegar a las unidades, daría igual usar $numero que $resto

69: pasa de comillas dobles a comillas simples

75, 76: diferente uso de las comillas en el echo, pero para usar las {} no sirven las comillas dobles en el atributo name

86: así queda de forma dinámica

Para 96 faltaba un cierre, que hace antes

Es 106, 105 es la expresión de JS, con el +

120 es con 85vh en el CSS

131: con esta sintaxis no se pueden usar operaciones o funciones

134 multiplicando xrr

143: con comillas simples tiene que usarse la forma de las líneas 38, 22
144 no se puede hacer, 145 sí
146: en la línea 22 también podemos añadir expresiones
147 sí se puede hacer

Lo de las líneas 24 a 29 es con comillas dobles. Permite llaves pero no operaciones

EJERCICIOS:
150: programa que simule 100.000 tiradas con 2 dados y nos diga los porcentajes que sale cada combinación
Nos deja usar arrays aunque no lo ve necesario

155 a 158: formulario que pide un valor y nos genera ese triángulo


170, 172: expresiones no correctas, parece que no permite operaciones en la concatenación con puntos, sólo variables

PRIMERAS VERSIONES DE LOS EJERCICIOS:
<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Tiradas de dados</title>
</head>

<body>

    <?php

    for ($i = 1; $i < 100001; $i++) {
        $dado1 = rand(1, 6);
        $dado2 = rand(1, 6);
        $suma = $dado1 + $dado2;
        $result[$suma]++;
    }


    for ($i=2; $i <13 ; $i++) { 
        $p = ($result[$i]/100000)*100;
        echo "<br> El resultado ".$i." sale un ". $p."% de veces";
    }

    ?>


</body>

</html>


<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Triángulo</title>
</head>

<body>

    <form action="index.php" method="post">

        <input type="number" name="numero" min=1 max=100 required>
        <input type="submit" value="Enviar">

    </form>

    <?php

    for ($lin = 1; $lin <= $_POST['numero']; $lin++) {
        echo "<br>";
        for ($estrellas = 1; $estrellas <= $lin; $estrellas++) {
            echo "*";
        }
    }


    ?>



</body>

</html>


180, 181:
Fatal error: Uncaught Error: Cannot use a scalar value as an array in /home/arturo/public_html/php/bucles/dados/index.php:20 Stack trace: #0 {main} thrown in /home/arturo/public_html/php/bucles/dados/index.php on line 20


184: Busco en Google "php dejar todo un array a 0":

Si quieres poner todos los valores de un array a 0 en PHP, hay varias formas seguras y eficientes de hacerlo, dependiendo de si quieres mantener las claves o no.

1️⃣ Manteniendo las claves originales
Si quieres que el array conserve sus índices (numéricos o asociativos):
Php<?php
$datos = [5, 8, 12, 3]; // Ejemplo de array

// Recorremos y asignamos 0 a cada elemento
foreach ($datos as $clave => $valor) {
    $datos[$clave] = 0;
}

print_r($datos);

Salida:
Array
(
    [0] => 0
    [1] => 0
    [2] => 0
    [3] => 0
)


2️⃣ Usando array_fill_keys() (mantiene claves)
Más compacto si quieres mantener las claves:
Php<?php
$datos = [5, 8, 12, 3];
$datos = array_fill_keys(array_keys($datos), 0);

print_r($datos);


3️⃣ Si no importa perder las claves
Si solo quieres un array del mismo tamaño pero lleno de ceros:
Php<?php
$datos = [5, 8, 12, 3];
$datos = array_fill(0, count($datos), 0);

print_r($datos);


✅ Recomendación:

Usa array_fill_keys() si quieres mantener las claves originales.
Usa array_fill() si solo te importa el tamaño y no las claves.


Si quieres, puedo prepararte una función reutilizable que ponga a cero cualquier array, manteniendo o no las claves según un parámetro.
¿Quieres que te la haga?




186: https://alejandro.avisando.com/php/bucles/dados/index.php


https://arturo.avisando.com/php/bucles/dados/index.php
También se me ocurre sin arrrays, pero bastante más largo
https://arturo.avisando.com/php/bucles/tri%C3%A1ngulo/index.php


https://arturo.avisando.com/php/bucles/tri%C3%A1ngulo/index.php
/home/arturo/Documentos/arturo.avisando.com/php/bucles/triángulo/index.php


VERSIONES GUAYS DE AMBOS:
<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Tiradas de dados</title>
</head>

<body>

    <?php

    for ($i = 2; $i < 13; $i++) {
        $result[$i] = 0;
    }

    for ($i = 1; $i < 100001; $i++) {
        $dado1 = rand(1, 6);
        $dado2 = rand(1, 6);
        $suma = $dado1 + $dado2;
        $result[$suma]++;
    }


    for ($i = 2; $i < 13; $i++) {
        $p = ($result[$i] / 100000) * 100;
        echo "<br> El resultado " . $i . " sale un " . $p . "% de veces";
    }

    ?>


</body>

</html>



<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Triángulo</title>
</head>

<body>

    <form action="index.php" method="post">

        <input type="number" name="numero" min=1 max=100 required>
        <input type="submit" value="Enviar">

    </form>

    <?php

    if (isset($_POST['numero'])) {
        for ($lin = 1; $lin <= $_POST['numero']; $lin++) {
            echo "<br>";
            for ($estrellas = 1; $estrellas <= $lin; $estrellas++) {
                echo "*";
            }
        }
    }


    ?>



</body>

</html>


*** Día 15/12/2025


El Node va del lado del servidor y lleva JS, pero en este curso el servidor es el profesor y no tiene Node, nosotros vamos de clientes
No nos da tiempo a ver Node o frameworks
Node da la capacidad de programar en JS e interpretarlo en entornos que no sean web, pero requiere instalar frameworks
Cada estilo tiene sus pros y contras, Node le parece más redundante del lado del servidor que PHP, .NET o Python

PHP ejecuta todas las líneas de arriba a abajo, sin embargo Node se detiene en las peticiones que tardan mucho (promesas o callbacks) sin dar aviso al cliente. Esto puede venir bien en unas ocasiones, pero en otras a lo mejor no.

Hasta 16: parece que un bucle infinito le ha llenado el disco duro con el log por errores.
En 17 rota los logs, y con eso parece resuelto (19)

Que Jose instale Vitalmin y abra el puerto 10000 para trasladar de servidor lo suyo, del nuestro al suyo


https://marcos.avisando.com/php/dados/index.php

https://marcos.avisando.com/php/dados/style.css

body{
    margin: 0%;
    padding: 0%;
    text-align: center;
    font-size: x-large;
    background-image: url(https://www.casi-casino.com/wp-content/uploads/2020/01/guillermo-velarde-e-4iBXpQo7U-unsplash-1-scaled.jpg);
    background-repeat: no-repeat;
    background-size: cover;
    color: gold;
}
ul li {
    list-style: none;
}
ul li a {
    color: white;
    text-decoration: none;
}



EJERCICIO: generador de presupuestos, facturas o albaranes
Formulario para decirle la cantidad de líneas y nos lleve a una zona con los datos del cliente: número de factura, nombre, CIF, dirección... y luego las líneas en cuestión con cantidad, precio, concepto
En cada uno un input para poder ir rellenando esos datos, y al final un botón de envío
100: al darle OK que nos genere un documento con el total sin IVA, el IVA al 21% y el total de factura, que sea imprimible

101 era con JS, busca algo más simple que esto, no hace falta que se calcule en tiempo real
Y prepararlo para impresión, con su CSS

Guardarlo en bucles/factura


https://ilias.avisando.com/php/for/piramide/index.php
https://ilias.avisando.com/php/for/dados/index.php

130: ¿me deja prescindir del echo?
136: ¿otra vez errores por los puntos y coma?
137: los pongo y sigue igual esto
138: ah, no, que faltaba el interrogante en 80

Y ya sólo nos quedaría el CSS, que tal vez nos obligue a tocar parte de la distribución de ambos ficheros

<link rel="stylesheet" href="style.css">

152: no me saca la tabla a pesar de que se cumple la condición de datoscli en este código:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Factura</title>
</head>

<body>


    <!-- 
EJERCICIO: generador de presupuestos, facturas o albaranes
Formulario para decirle la cantidad de líneas y nos lleve a una zona con los datos del cliente: número de factura, nombre, CIF, dirección... 
y luego las líneas en cuestión con cantidad, precio, concepto
En cada uno un input para poder ir rellenando esos datos, y al final un botón de envío
100: al darle OK que nos genere un documento con el total sin IVA, el IVA al 21% y el total de factura, que sea imprimible

101 era con JS, busca algo más simple que esto, no hace falta que se calcule en tiempo real
Y prepararlo para impresión, con su CSS
 -->

    <header>
        <br>
        <h1> Ejercicio de presupuesto </h1><br>
        <h2> Indique el número de artículos </h2>

        <form action="index.php" method="post">
            <input type="number" name="numarticulos" placeholder="Número de artículos" min=1 required>
            <input type="submit" value="Enviar">
        </form>

    </header>

    <main>

        <?php
        if (isset($_POST['numarticulos'])) {
        ?>


            <h3> Datos del cliente </h3>

            <form action="index.php" method="post">
                <input type="text" name="numfac0" placeholder="Número de factura" minlength=8 required>
                <input type="text" name="nomcli0" placeholder="Nombre del cliente" required>
                <input type="text" name="cifcli0" placeholder="CIF/NIF" minlength=8 required>
                <input type="text" name="dircli0" placeholder="Dirección del cliente" required>
                <input type="hidden" name="datoscli" value=1>
                <input type="submit" value="Enviar">
            </form>

            <?php
            if (isset($_POST['datoscli'])) {
            ?>

                <form action="factura.php" method="post">

                    <table>

                        <tr>
                            <th>Artículo</th>
                            <th>Cantidad</th>
                            <th>Precio</th>
                        </tr>

                        <?php

                        for ($i = 1; $i <= $_POST['numarticulos']; $i++) {

                        ?>
                            <tr>
                                <td><input type="text" name="concepto<?php echo $i ?>" placeholder="Artículo" required></td>
                                <td><input type="number" name="cantidad" placeholder="Cantidad<?php echo $i ?>" min=1 required></td>
                                <td><input type="number" name="precio" placeholder="Precio<?php echo $i ?>" required></td>
                            </tr>
                        <?php } ?>

                    </table>

                    <input type="hidden" name="numfac" value=$_POST['numfac0']>
                    <input type="hidden" name="nomcli" value=$_POST['nomcli0']>
                    <input type="hidden" name="cifcli" value=$_POST['cifcli0']>
                    <input type="hidden" name="dircli" value=$_POST['dircli0']>
                    <input type="hidden" name="numart" value=$_POST['numarticulos']>

                    <input type="submit" value="Enviar">
                </form>

            <?php } ?>

        <?php } ?>

    </main>

</body>

</html>


Cambio             if (isset($_POST['datoscli'])) { por             if (isset($_POST['numfac0'])) { y lo mismo... A ver si sacando fuera este if, a ver qué pasa:

156: bien, ya avanza, pero ahora me dice que Warning: Undefined array key "numarticulos" in /home/arturo/public_html/php/bucles/factura/index.php on line 71
Es decir, que ahora que me reconoce $_POST['datoscli'] no me reconoce $_POST['numarticulos']… debe ser que sólo reconoce el último formulario, se me ocurre... A ver si pasándolo a variable consigo salvarlo con el if dentro del if

159: nada, en blanco con el siguiente código:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Factura</title>
</head>

<body>


    <!-- 
EJERCICIO: generador de presupuestos, facturas o albaranes
Formulario para decirle la cantidad de líneas y nos lleve a una zona con los datos del cliente: número de factura, nombre, CIF, dirección... 
y luego las líneas en cuestión con cantidad, precio, concepto
En cada uno un input para poder ir rellenando esos datos, y al final un botón de envío
100: al darle OK que nos genere un documento con el total sin IVA, el IVA al 21% y el total de factura, que sea imprimible

101 era con JS, busca algo más simple que esto, no hace falta que se calcule en tiempo real
Y prepararlo para impresión, con su CSS
 -->

    <header>
        <br>
        <h1> Ejercicio de presupuesto </h1><br>
        <h2> Indique el número de artículos </h2>


        <?php
        $numarticulos = 0;
        ?>

        <form action="index.php" method="post">
            <input type="number" name="numarticulos" placeholder="Número de artículos" min=1 required>
            <input type="submit" value="Enviar">
        </form>

    </header>

    <main>

        <?php
        if (isset($_POST['numarticulos'])) {
            $numarticulos = $_POST['numarticulos'];
        }

        if ($numarticulos > 0) {
        ?>


            <h3> Datos del cliente </h3>

            <form action="index.php" method="post">
                <input type="text" name="numfac0" placeholder="Número de factura" minlength=8 required>
                <input type="text" name="nomcli0" placeholder="Nombre del cliente" required>
                <input type="text" name="cifcli0" placeholder="CIF/NIF" minlength=8 required>
                <input type="text" name="dircli0" placeholder="Dirección del cliente" required>
                <input type="hidden" name="datoscli" value=1>
                <input type="submit" value="Enviar">
            </form>

            <?php

            if (isset($_POST['numfac0'])) {
            ?>

                <form action="factura.php" method="post">

                    <table>

                        <tr>
                            <th>Artículo</th>
                            <th>Cantidad</th>
                            <th>Precio</th>
                        </tr>

                        <?php

                        for ($i = 1; $i <= $numarticulos; $i++) {

                        ?>
                            <tr>
                                <td><input type="text" name="concepto<?php echo $i ?>" placeholder="Artículo" required></td>
                                <td><input type="number" name="cantidad" placeholder="Cantidad<?php echo $i ?>" min=1 required></td>
                                <td><input type="number" name="precio" placeholder="Precio<?php echo $i ?>" required></td>
                            </tr>
                        <?php } ?>

                    </table>

                    <input type="hidden" name="numfac" value=$_POST['numfac0']>
                    <input type="hidden" name="nomcli" value=$_POST['nomcli0']>
                    <input type="hidden" name="cifcli" value=$_POST['cifcli0']>
                    <input type="hidden" name="dircli" value=$_POST['dircli0']>
                    <input type="hidden" name="numart" value="<?php echo $numarticulos; ?>">

                    <input type="submit" value="Enviar">
                </form>

            <?php } ?>

        <?php } ?>

    </main>

</body>

</html>



https://alejandro.avisando.com/php/bucles/presupuesto/index.php


*** Día 16/12/2025

De "151225 pregunta": si tenemos dos formularios con dos botones de envío te coge sólo el segundo, para que recupere lo del primero habría que meterle en el segundo un input hidden con la variable del primero que queremos recuperar

Respecto al ejercicio, es más fácil en dos pasos que en tres como intentaba yo


11: pronósticos más apostados y coger el json
14: se convierte en un array y luego se recorre el array

En VS Code Ctrl+A para seleccionar todo

A la posición en un array se le llama key, llave, índice...

35: print_r es como echo pero para imprimir arrays

C y Java no permiten redimensionar arrays como PHP, tendrías que copiar el contenido a otro array o usar punteros


EJERCICIO:
desde el triángulo que los lados sean asteriscos pero dentro sólo haya espacios

54: resolvemos el ejercicio de la factura
59: el dinamismo de añadir filas sin decir el total al principio es con JS
La generación dinámica de PDF's ocupa mucho, es mejor imprimir a PDF una web
61: el tamaño de la casilla del input depende de su placeholder

63: las simplificadas son los tickets. Las series de factura van según tipo de negocio

Los números de factura tienen que ser secuenciales, y sin saltos de fecha. Puedes reiniciar el contador cada 01/Enero, pero sólo entonces

64: la forma de generar un input abreviadamente
65 es el mínimo que se necesita del cliente para facturar
66: me había olvidado de los thead, tbody...

72: como lleva corchetes será un array
76: selected es el valor seleccionado por defecto
79: si tuviéramos el mismo name sólo nos llevaría el último, pero esto es un array
Esto es un $_POST['concepto'][0], la variable utiliza dos dimensiones
Podemos usar infinitas dimensiones

86 lleva a 85

92 desde "div table css" en Google... y copia el estilo resultante a su CSS, para llegar a 98

95 para saber cuántos elementos hay en el array

104 a 105 volviendo atrás para modificar el formulario

107: a $neto se le resta ese valor

108: faltaban los corchetes de descuento y no era un array, por eso en 109 hay que rellenar de nuevo el formulario

115: aquí ya está bien el neto

133: el nombre se puede automatizar

141 con importes redondeados

149: aquí el programa era este:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Triángulo</title>
</head>

<body>

    <form action="index.php" method="post">

        <input type="number" name="numero" min=1 max=100 required>
        <input type="submit" value="Enviar">

    </form>

    <?php

    if (isset($_POST['numero'])) {
        for ($lin = 1; $lin <= $_POST['numero']; $lin++) {
            echo "<br>";
            for ($estrellas = 1; $estrellas <= $lin; $estrellas++) {

                if (($estrellas == 1) or ($estrellas == $lin) or ($lin==$_POST['numero'])) {
                    echo "*";
                } else {
                    echo "&nbsp;";
                }
            }
        }
    }


    ?>



</body>

</html>



150: ok, es un efecto visual de Chrome, al copiar y pegar aquí el resultado para 13 es este, el correcto:

*
**
* *
*  *
*   *
*    *
*     *
*      *
*       *
*        *
*         *
*          *
*************

Jugar en el CSS con el tamaño de los espacios o usar fuentes monospace


*** Día 17/12/2025

¿Antes de esto?
Que el tablero de reinas
Que el laberinto que no entiendo
Que una quiniela
11:23 y sigue el calor de diciembre

Para 5 partidos, programa que saque todas las combinaciones posibles

Resumiendo, según foto de la hoja de Jose:
Los 4 triángulos, sólo con los lados
Tablero de ajedrez, que nos pida el número de lados y empiece por blancas, y ponga la figura del color inverso
El rombo
Lo de la quiniela


EL EJERCICIO DE AYER, CON ESTILOS:
(con monospace para que salga bien el triángulo)

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Triángulo</title>
    <style>
        body{
            font-family: monospace;
        }
    </style>
</head>

<body>

    <form action="index.php" method="post">

        <input type="number" name="numero" min=1 max=100 required>
        <input type="submit" value="Enviar">

    </form>

    <?php

    if (isset($_POST['numero'])) {
        for ($lin = 1; $lin <= $_POST['numero']; $lin++) {
            echo "<br>";
            for ($estrellas = 1; $estrellas <= $lin; $estrellas++) {

                if (($estrellas == 1) or ($estrellas == $lin) or ($lin==$_POST['numero'])) {
                    echo "*";
                } else {
                    echo "&nbsp;";
                }
            }
        }
    }


    ?>



</body>

</html>


Y 6 nos lleva a 7


EL DE LOS 4 TRIÁNGULOS A LAS 14:08, no entiendo por qué no sale bien pero lo pensaré otro día:
(Corresponde a los pantallazos 12 y 13)
<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>4 triángulos</title>
    <style>
        body {
            font-family: monospace;
        }
    </style>
</head>

<body>

    <form action="index.php" method="post">

        <input type="number" name="numero" min=1 max=100 required>
        <input type="submit" value="Enviar">

    </form>

    <?php

    if (isset($_POST['numero'])) {

        for ($lin = 1; $lin <= $_POST['numero']; $lin++) {   //De 1 a max hacia la izquierda, el renegado, la C inversa
            echo "<br>";
            for ($estrellas = 1; $estrellas <= $_POST['numero']; $estrellas++) {

                if (($estrellas == $_POST['numero']) or ($estrellas == (14-$lin)) or ($lin == $_POST['numero'])) {
                    echo "*";
                } else {
                    echo "&nbsp;";
                }
            }
        }

        for ($lin = $_POST['numero']; $lin >= 1; $lin--) {    //la réplica del anterior
            echo "<br>";
            for ($estrellas = 1; $estrellas <= $_POST['numero']; $estrellas++) {

                if (($estrellas == $_POST['numero']) or ($estrellas == (14-$lin)) or ($lin == $_POST['numero'])) {
                    echo "*";
                } else {
                    echo "&nbsp;";
                }
            }
        }


        for ($lin = 1; $lin <= $_POST['numero']; $lin++) {   //De 1 a max hacia la derecha, la base
            echo "<br>";
            for ($estrellas = 1; $estrellas <= $lin; $estrellas++) {

                if (($estrellas == 1) or ($estrellas == $lin) or ($lin == $_POST['numero'])) {
                    echo "*";
                } else {
                    echo "&nbsp;";
                }
            }
        }

        for ($lin = $_POST['numero']; $lin >= 1; $lin--) {   //De max a 1 hacia la derecha, la réplica
            echo "<br>";
            for ($estrellas = 1; $estrellas <= $lin; $estrellas++) {

                if (($estrellas == 1) or ($estrellas == $lin) or ($lin == $_POST['numero'])) {
                    echo "*";
                } else {
                    echo "&nbsp;";
                }
            }
        }
    }


    ?>



</body>

</html>


*** Día 18/12/2025

Ejercicios según hoy:
Los 4 triángulos, macizos
Tablero de ajedrez, que nos pida el número de lados y empiece por blancas, y ponga la figura del color inverso
El rombo, macizo
Lo de la quiniela


LOS 4 TRIÁNGULOS, BLANCOS Y MACIZOS, ya parece que bien (eso pienso):
<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>4 triángulos</title>
    <style>
        body {
            font-family: monospace;
        }
    </style>
</head>

<body>

    <form action="index.php" method="post">

        <input type="number" name="numero" min=1 max=100 required>
        <input type="submit" value="Enviar">

    </form>

    <?php

    if (isset($_POST['numero'])) {

        for ($lin = 1; $lin <= $_POST['numero']; $lin++) {   //De 1 a max hacia la izquierda, el renegado, la C inversa
            echo "<br>";
            for ($estrellas = 1; $estrellas <= $_POST['numero']; $estrellas++) {

                if (($estrellas == $_POST['numero']) or ($estrellas == ($_POST['numero'] + 1 - $lin)) or ($lin == $_POST['numero'])) {
                    echo "*";
                } else {
                    echo "&nbsp;";
                }
            }
        }

        for ($lin = $_POST['numero']; $lin >= 1; $lin--) {    //la réplica del anterior
            echo "<br>";
            for ($estrellas = 1; $estrellas <= $_POST['numero']; $estrellas++) {

                if (($estrellas == $_POST['numero']) or ($estrellas == ($_POST['numero'] + 1 - $lin)) or ($lin == $_POST['numero'])) {
                    echo "*";
                } else {
                    echo "&nbsp;";
                }
            }
        }


        for ($lin = 1; $lin <= $_POST['numero']; $lin++) {   //De 1 a max hacia la derecha, la base
            echo "<br>";
            for ($estrellas = 1; $estrellas <= $lin; $estrellas++) {

                if (($estrellas == 1) or ($estrellas == $lin) or ($lin == $_POST['numero'])) {
                    echo "*";
                } else {
                    echo "&nbsp;";
                }
            }
        }

        for ($lin = $_POST['numero']; $lin >= 1; $lin--) {   //De max a 1 hacia la derecha, la réplica
            echo "<br>";
            for ($estrellas = 1; $estrellas <= $lin; $estrellas++) {

                if (($estrellas == 1) or ($estrellas == $lin) or ($lin == $_POST['numero'])) {
                    echo "*";
                } else {
                    echo "&nbsp;";
                }
            }
        }
    }


    ?>



</body>

</html>


<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>4 triángulos</title>
    <style>
        body {
            font-family: monospace;
        }
    </style>
</head>

<body>

    <form action="index.php" method="post">

        <input type="number" name="numero" min=1 max=100 required>
        <input type="submit" value="Enviar">

    </form>

    <?php

    if (isset($_POST['numero'])) {  //triángulos macizos

        for ($lin = 1; $lin <= $_POST['numero']; $lin++) {   //De 1 a max hacia la izquierda, el renegado, la C inversa
            echo "<br>";
            for ($estrellas = 1; $estrellas <= $_POST['numero']; $estrellas++) {

                if (($estrellas == $_POST['numero']) or ($estrellas >= ($_POST['numero'] + 1 - $lin)) or ($lin == $_POST['numero'])) {
                    echo "*";
                } else {
                    echo "&nbsp;";
                }
            }
        }

        for ($lin = $_POST['numero']; $lin >= 1; $lin--) {    //la réplica del anterior
            echo "<br>";
            for ($estrellas = 1; $estrellas <= $_POST['numero']; $estrellas++) {

                if (($estrellas == $_POST['numero']) or ($estrellas >= ($_POST['numero'] + 1 - $lin)) or ($lin == $_POST['numero'])) {
                    echo "*";
                } else {
                    echo "&nbsp;";
                }
            }
        }


        for ($lin = 1; $lin <= $_POST['numero']; $lin++) {   //De 1 a max hacia la derecha, la base
            echo "<br>";
            for ($estrellas = 1; $estrellas <= $lin; $estrellas++) {

                if (($estrellas == 1) or ($estrellas <= $lin) or ($lin == $_POST['numero'])) {
                    echo "*";
                } else {
                    echo "&nbsp;";
                }
            }
        }

        for ($lin = $_POST['numero']; $lin >= 1; $lin--) {   //De max a 1 hacia la derecha, la réplica
            echo "<br>";
            for ($estrellas = 1; $estrellas <= $lin; $estrellas++) {

                if (($estrellas == 1) or ($estrellas <= $lin) or ($lin == $_POST['numero'])) {
                    echo "*";
                } else {
                    echo "&nbsp;";
                }
            }
        }
    }


    ?>



</body>

</html>


ROMBO, BLANCO Y MACIZO, PRIMER INTENTO:
(Tal vez haya que calibrar el if $estrellas por lo de > y <, y el for $hueco, es mi primera traza)

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Rombo blanco</title>
    <style>
        body {
            font-family: monospace;
        }
    </style>
</head>

<body>

    <form action="index.php" method="post">

        <input type="number" name="numero" min=1 max=100 required>
        <input type="submit" value="Enviar">

    </form>

    <?php

    if (isset($_POST['numero'])) {

        for ($lin = 1; $lin <= $_POST['numero']; $lin++) {   //Mitad superior
            echo "<br>";
            for ($estrellas = 1; $estrellas <= $_POST['numero']; $estrellas++) {

                if (($estrellas == $_POST['numero']) or ($estrellas == ($_POST['numero'] + 1 - $lin)) or ($lin == $_POST['numero'])) {
                    echo "*";
                    for ($hueco=1;$hueco=$lin-1;$hueco++){
                    echo "&nbsp;";    
                    }
                    echo "*";
                } else {
                    echo "&nbsp;";
                }
            }
        }


        for ($lin = $_POST['numero']; $lin >= 1; $lin--) {    //Mitad inferior
            echo "<br>";
            for ($estrellas = 1; $estrellas <= $_POST['numero']; $estrellas++) {

                if (($estrellas == $_POST['numero']) or ($estrellas == ($_POST['numero'] + 1 - $lin)) or ($lin == $_POST['numero'])) {
                    echo "*";
                    for ($hueco=1;$hueco=$lin-1;$hueco++){
                    echo "&nbsp;";    
                    }
                    echo "*";
                } else {
                    echo "&nbsp;";
                }
            }
        }


    }


    ?>



</body>

</html>






<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Rombo macizo</title>
    <style>
        body {
            font-family: monospace;
        }
    </style>
</head>

<body>

    <form action="index.php" method="post">

        <input type="number" name="numero" min=1 max=100 required>
        <input type="submit" value="Enviar">

    </form>

    <?php

    if (isset($_POST['numero'])) {

        for ($lin = 1; $lin <= $_POST['numero']; $lin++) {   //Mitad superior
            echo "<br>";
            for ($estrellas = 1; $estrellas <= $_POST['numero']; $estrellas++) {

                if (($estrellas == $_POST['numero']) or ($estrellas >= ($_POST['numero'] + 1 - $lin)) or ($lin == $_POST['numero'])) {
                    echo "*";
                    for ($hueco=1;$hueco=$lin-1;$hueco++){
                    echo "&nbsp;";    
                    }
                    echo "*";
                } else {
                    echo "&nbsp;";
                }
            }
        }


        for ($lin = $_POST['numero']; $lin >= 1; $lin--) {    //Mitad inferior
            echo "<br>";
            for ($estrellas = 1; $estrellas <= $_POST['numero']; $estrellas++) {

                if (($estrellas == $_POST['numero']) or ($estrellas >= ($_POST['numero'] + 1 - $lin)) or ($lin == $_POST['numero'])) {
                    echo "*";
                    for ($hueco=1;$hueco=$lin-1;$hueco++){
                    echo "&nbsp;";    
                    }
                    echo "*";
                } else {
                    echo "&nbsp;";
                }
            }
        }


    }


    ?>



</body>

</html>


QUINIELA, PRIMER INTENTO, la masa iterativa a lo bruto, sin procesar:
(Lo dicho, que la he metido a lo bruto, no sé si este tipo de proceso conllevará quinielas repetidas)

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Quinielas</title>
</head>

<body>

    <header>

        <h3> ¿Cuántas posibilidades hay entre los 14 resultados de la quiniela? </h3>

    </header>

    <main>

        <form action="index.php" method="post">

            <p> Pulsa en Enviar para empezar la iteración </p>
            <input type="hidden" name="entra" value=1>
            <input type="submit" value="Enviar">

        </form>

        <?php

        if ($isset($_POST['entra'])) {  //Pulsó, pulsó

            for ($i = 1; $i <= 14; $i++) {  //Inicializando, es la parte fácil
                $partido[$i] = 1;
            }
            $total = 0;

            for ($i1 = 1; $i1 <= 14; $i1++) {
                for ($j1 = 1; $j1 <= 3; $j1++) {
                    $partido[$i1] = $j1;

                    for ($i2 = 2; $i2 <= 14; $i2++) {
                        for ($j2 = 1; $j2 <= 3; $j2++) {
                            $partido[$i2] = $j2;

                            for ($i3 = 3; $i3 <= 14; $i3++) {
                                for ($j3 = 1; $j3 <= 3; $j3++) {
                                    $partido[$i3] = $j3;

                                    for ($i4 = 4; $i4 <= 14; $i4++) {
                                        for ($j4 = 1; $j4 <= 3; $j4++) {
                                            $partido[$i4] = $j4;

                                            for ($i5 = 5; $i5 <= 14; $i5++) {
                                                for ($j5 = 1; $j5 <= 3; $j5++) {
                                                    $partido[$i5] = $j5;

                                                    for ($i6 = 6; $i6 <= 14; $i6++) {
                                                        for ($j6 = 1; $j6 <= 3; $j6++) {
                                                            $partido[$i6] = $j6;

                                                            for ($i7 = 7; $i7 <= 14; $i7++) {
                                                                for ($j7 = 1; $j7 <= 3; $j7++) {
                                                                    $partido[$i7] = $j7;

                                                                    for ($i8 = 8; $i8 <= 14; $i8++) {
                                                                        for ($j8 = 1; $j8 <= 3; $j8++) {
                                                                            $partido[$i8] = $j8;

                                                                            for ($i9 = 9; $i9 <= 14; $i9++) {
                                                                                for ($j9 = 1; $j9 <= 3; $j9++) {
                                                                                    $partido[$i9] = $j9;

                                                                                    for ($i10 = 10; $i10 <= 14; $i10++) {
                                                                                        for ($j10 = 1; $j10 <= 3; $j10++) {
                                                                                            $partido[$i10] = $j10;

                                                                                            for ($i11 = 11; $i11 <= 14; $i11++) {
                                                                                                for ($j11 = 1; $j11 <= 3; $j11++) {
                                                                                                    $partido[$i11] = $j11;

                                                                                                    for ($i12 = 12; $i12 <= 14; $i12++) {
                                                                                                        for ($j12 = 1; $j12 <= 3; $j12++) {
                                                                                                            $partido[$i12] = $j12;

                                                                                                            for ($i13 = 13; $i13 <= 14; $i13++) {
                                                                                                                for ($j13 = 1; $j13 <= 3; $j13++) {
                                                                                                                    $partido[$i13] = $j13;

                                                                                                                    for ($i14 = 14; $i14 <= 14; $i14++) {
                                                                                                                        for ($j14 = 1; $j14 <= 3; $j14++) {
                                                                                                                            $partido[$i14] = $j14;
                                                                                                                            $total++;
                                                                                                                            echo "<br>Quiniela número " . $total . ": ";
                                                                                                                            print_r($partido);
                                                                                                                        }
                                                                                                                    }
                                                                                                                }
                                                                                                            }
                                                                                                        }
                                                                                                    }
                                                                                                }
                                                                                            }
                                                                                        }
                                                                                    }
                                                                                }
                                                                            }
                                                                        }
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }


            echo "<br> La iteración presente da un total de {$total} quinielas";
        }

        ?>




    </main>




</body>

</html>


Me quedaría el ejercicio del tablero de ajedrez (11:32): imagen con fondo y bordes en CSS, pensaba ayer


$variable=file_get_contents(URL) para incluir información de esa web en la variable
file_put_contents para guardar en un fichero el contenido de una variable, por ejemplo de la anterior
... y se rellena el fichero con la información de la web
(La web la ha visto en Inspeccionar-Red, allí ha encontrado el json)

curl y la url desde la consola de Debian es una petición desde allí a la web
En este caso le denegaba el acceso y programa en php la petición tipo php que haría Chrome (lo busca en grok)
En esa petición aparece un encabezado, que es con lo que el navegador se presenta a la url
php quiniela.php, instrucción que sirve para ejecutar ese php desde la consola de Debian

Virtualmin tiene tareas de cron planificadas, para que ejecute de forma automática el comando indicado (la extracción de la url hacia el fichero)

Desde 11: Lo programa sobre las 5 de la madrugada porque habrá menos tráfico

Cada vez que se ejecuta el programa la información no se acumula, se machaca

$partidos es un array

28: estadisticas.php es una copia del otro fichero

42: y vamos a probar si funciona, ejecutando antes de automatizar

58: otro json

61 porque en 62 tenía un echo response;

75 poniendo 86 en vez de 84 en el id

86:_DIR_ devuelve el directorio de trabajo actual

93: faltaba una barra y no completaba el json

Puedes meter en las tareas de cron un comando hacia un fichero global que integre todas las tareas que necesitas


*** Día 19/12/2025

35: efectivamente, en https://www.php.net/manual/es/language.operators.arithmetic.php no veo mod como operador del resto

34: busco en Google "php mostrar imágenes con echo" y veo esto:

En PHP puedes mostrar imágenes en el navegador usando echo para imprimir la etiqueta HTML <img>.
Lo importante es usar comillas correctamente y especificar bien la ruta de la imagen.

Ejemplo básico
Php<?php
// Mostrar una imagen desde la misma carpeta del script
echo '<img src="imagen.jpg" alt="Descripción de la imagen">';
?>


Ejemplo con ruta y variables
Php<?php
$nombreImagen = "foto.png";
$ruta = "imagenes/"; // Carpeta donde está la imagen

// Usando comillas dobles para interpolar variables
echo "<img src='{$ruta}{$nombreImagen}' alt='Foto de perfil' width='200' height='200'>";
?>


Ejemplo con validación de archivo
Es recomendable verificar que el archivo existe antes de mostrarlo:
Php<?php
$imagen = "imagenes/foto.jpg";

if (file_exists($imagen)) {
    echo "<img src='$imagen' alt='Imagen encontrada' style='border:1px solid #ccc'>";
} else {
    echo "<p>Imagen no encontrada.</p>";
}
?>


✅ Consejos importantes:

Usa comillas simples ' ' dentro de echo si tu HTML usa comillas dobles " " para atributos, o viceversa, para evitar errores de sintaxis.
Si la imagen está en otra carpeta o servidor, pon la ruta completa o URL.
Siempre añade el atributo alt por accesibilidad y SEO.
Si la imagen es dinámica (por ejemplo, subida por un usuario), valida la ruta para evitar problemas de seguridad.


Si quieres, puedo prepararte un script PHP que muestre automáticamente todas las imágenes de una carpeta usando echo.
¿Quieres que te lo haga?


Así que ya lo hago yo y cambio las comillas según 'Ejemplo básico'
37: y ya no tenemos errores, era eso

55: VSCode, VSCode, súbeme las imágenes, anda, que eres muy reacio a subiiiiiiirlas
57: esto es tras el upload folder. Era esto, pero tengo imágenes muy grandes
66: esto es a 50, pero tal vez es demasiado pequeñito
70: vale, lo dejo en 50, mira cómo me llena el tablero a 8*8. Me quedaría sólo meter el isset para que no salga el warning y fuera

89: Alfonso lo dará desde casa y a 40 la hora

… pero parece que el placeholder no me amplía el tamaño de la casilla... a buscar, en este caso "html cambiar tamaño a casilla del input"

Para cambiar el tamaño de una casilla (<input>) en HTML tienes dos formas principales: usando el atributo size o aplicando estilos CSS con width.

1. Usando el atributo size (en caracteres)
Este método ajusta el ancho en función del número de caracteres visibles.
Html<input type="text" size="20" placeholder="Escribe aquí">


size="20" → muestra espacio para aproximadamente 20 caracteres.
Funciona solo con tipos de input como text, search, tel, url, email y password.


2. Usando CSS (en píxeles, %, etc.)
Este método es más flexible y recomendado para diseños responsivos.
Html<input type="text" style="width: 300px;" placeholder="Escribe aquí">

O con una clase CSS:
Html<style>
  .campo-grande {
    width: 50%;       /* ancho relativo al contenedor */
    max-width: 400px; /* ancho máximo */
    padding: 5px;     /* espacio interno */
  }
</style>

<input type="text" class="campo-grande" placeholder="Escribe aquí">


✅ Recomendación:

Usa CSS si quieres control preciso y diseño adaptable.
Usa size solo para ajustes rápidos y simples.

Si quieres, puedo prepararte un ejemplo completo con varios inputs de distinto tamaño para que lo veas en acción.
¿Quieres que te lo haga?


En fin, que ya tengo el programita:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Tablero</title>
    <link rel="stylesheet" href="style.css">
</head>

<body>

    <header>
        <form action="index.php" method="post">
            <input type="number" name="lineas" placeholder="Número de líneas" min=1 max=8 required>
            <input type="submit" value="Enviar">
        </form>
    </header>

    <main>

        <table border="1">

            <?php
            for ($lin = 1; $lin <= $_POST['lineas']; $lin++) {
                echo "<div>";
                echo "<tr>";
                for ($col = 1; $col <= $_POST['lineas']; $col++) {
                    echo "<td>";
                    if (($lin + $col) % 2 == 0) {
                        echo '<img src="blanca.jpg" width="50px">';
                    } else {
                        echo '<img src="negra.avif" width="50px">';
                    }
                    echo "</td>";
                }
                echo "</tr>";
                echo "</div>";
            }
            ?>

        </table>

    </main>

</body>

</html>


* {
    box-sizing: border-box;
}

/* div {
    display: inline-block;
}
    Ah, cierto, que es una tabla... pues ya tengo el inline-block... Ah, entonces el div lo mismo tampoco vale para nada
 */


Eso sí, es mejorable: creo que puedo quitar el CSS y el div del index, y me quedaría lo del isset


102 para rombo de 6
103 para rombo de 13
104 es para rombo de 89
108 para rombo de 27
… Espera, ¿y si cojo el de los triángulos, le meto dos div y un CSS para que los junte? Luego les quito la parte central y la de abajo y señores... ¡¡rombo!!


… 148: pero tal vez me faltaría el puntito superior, si junto los div... se me ocurre. Vaya


EJERCICIOS BUCLES SENCILLOS, que no hago:

Ejercicio 1: Bucle for básico
Muestra en pantalla los números del 1 al 20, cada uno en una línea nueva.
Ejercicio 2: Números pares con while
Usa un bucle while para mostrar los números pares entre 2 y 50 (inclusive).
Ejercicio 3: Tabla de multiplicar con do-while
Pide al usuario un número del 1 al 10 (puedes simularlo con una variable) y muestra su tabla de multiplicar del 1 al 10 usando un bucle do-while.
Ejercicio 4: Suma acumulada con for
Calcula y muestra la suma de los números del 1 al 100 usando un bucle for.
Ejercicio 5: Contar vocales con foreach
Dada la cadena $texto = "Programación en PHP es divertida";, usa un bucle foreach para contar cuántas vocales (a, e, i, o, u, mayúsculas y minúsculas) contiene y muéstralo.
Ejercicio 6: Pirámide de asteriscos con for anidado
Usa bucles for anidados para imprimir una pirámide de asteriscos de 5 niveles:
text*
   ***
  *****
 *******
*********
Ejercicio 7: Break y continue
Usa un bucle for del 1 al 20. Si el número es múltiplo de 3, salta al siguiente (continue). Si llega a 17, detén el bucle (break). Muestra los números procesados.
Ejercicio 8: Factorial con while
Calcula el factorial de un número (por ejemplo, 8) usando un bucle while y muéstralo.
Ejercicio 9: Array asociativo con foreach
Crea un array asociativo con nombres de alumnos y sus notas:
PHP$alumnos = [
    "Ana" => 8.5,
    "Luis" => 6.0,
    "María" => 9.2,
    "Pedro" => 7.8,
    "Sofía" => 5.5
];
Usa foreach para mostrar solo los alumnos aprobados (nota ≥ 6.0) con el formato: "Ana ha aprobado con 8.5".
Ejercicio 10: Números primos con for y break
Muestra todos los números primos entre 2 y 100. Para cada número, usa un bucle interno que verifique si tiene divisores. Si encuentra uno, usa break para pasar al siguiente número.


*** Día 22/12/2025

61 lo borra en ese momento
Download file del json y 65

74: Cookie: fichero generado del lado del cliente donde se puede guardar información
setcookie crea la cookie


79: el problema viene por la falta de step
95: true para convertirlo en un array, que se muestra en 94
97: hace que la cookie caduque
10/: otro paso a array

117: los números sin ceros a la izquierda


https://javier.avisando.com/php/loteria/index.php
Y como la cookie va del lado del cliente, los números que metamos no se mezclan con los de los demás

164: faltaba la barra para que la información no se quede por debajo y vaya a ese fichero que buscamos

79432
188: ¿actualiza el registro de números desde aquí?

190: el bucle comprueba rápido

En Python existe el concepto diccionario

Alfonso hace la petición desde el servidor, que cara a la red funciona con la IP, no con el dominio

217: aquí en el referer hay un dominio permitido
218, 219 para hacer menos ruido (cibernético)

Al borrar una posición X de un array puedes hacerlo de dos formas: que se reordene sin dejar huecos o que el hueco quede como null


222: y vamos con los ejercicios

260 lleva a 259


La web del descanso es así:
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Estamos en el descanso</title>
    <style>
        body{
            background-color: azure;
        }
        h1{
            display: block;
            text-align: center;
            font-size: 3em;
            margin-top: 250px;
            font-family: Arial, Helvetica, sans-serif;
            color: cornflowerblue;
        }
    </style>
</head>
<body>
    <h1>Estamos en el descanso...</h1>
</body>
</html>


EJERCICIO:
Dados mes y año que nos pinte el calendario correspondiente, según guía de 345 a 347

https://javier.avisando.com/php/bucles/sencillos.txt

Batería de if's:
Ejercicio 1: Bucle for básico
Muestra en pantalla los números del 1 al 20, cada uno en una línea nueva.
Ejercicio 2: Números pares con while
Usa un bucle while para mostrar los números pares entre 2 y 50 (inclusive).
Ejercicio 3: Tabla de multiplicar con do-while
Pide al usuario un número del 1 al 10 (puedes simularlo con una variable) y muestra su tabla de multiplicar del 1 al 10 usando un bucle do-while.
Ejercicio 4: Suma acumulada con for
Calcula y muestra la suma de los números del 1 al 100 usando un bucle for.
Ejercicio 5: Contar vocales con foreach
Dada la cadena $texto = "Programación en PHP es divertida";, usa un bucle foreach para contar cuántas vocales (a, e, i, o, u, mayúsculas y minúsculas) contiene y muéstralo.
Ejercicio 6: Pirámide de asteriscos con for anidado
Usa bucles for anidados para imprimir una pirámide de asteriscos de 5 niveles:
text*
   ***
  *****
 *******
*********
Ejercicio 7: Break y continue
Usa un bucle for del 1 al 20. Si el número es múltiplo de 3, salta al siguiente (continue). Si llega a 17, detén el bucle (break). Muestra los números procesados.
Ejercicio 8: Factorial con while
Calcula el factorial de un número (por ejemplo, 8) usando un bucle while y muéstralo.
Ejercicio 9: Array asociativo con foreach
Crea un array asociativo con nombres de alumnos y sus notas:
PHP$alumnos = [
    "Ana" => 8.5,
    "Luis" => 6.0,
    "María" => 9.2,
    "Pedro" => 7.8,
    "Sofía" => 5.5
];
Usa foreach para mostrar solo los alumnos aprobados (nota ≥ 6.0) con el formato: "Ana ha aprobado con 8.5".
Ejercicio 10: Números primos con for y break
Muestra todos los números primos entre 2 y 100. Para cada número, usa un bucle interno que verifique si tiene divisores. Si encuentra uno, usa break para pasar al siguiente número.


356: ya, al final no acabará así, pero me hace gracia la diferencia de lugar entre las etiquetas de la tabla... y que no me dé error la sintaxis


FASE PRIMARIA DEL ARCHIVO:
<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> Calendario del mes </title>
</head>

<body>



    <header>

        <form action="index.php" method="post">
            <input type="number" name="month" id="month" min=1 max=12 step=1 placeholder="Mes">
            <input type="number" name="year" id="year" min=1 step=1 placeholder="Año">
            <input type="submit" value="Enviar">
        </form>

        <?php
        $month = $_POST['month'];
        $year = $_POST['year'];

        ?>

    </header>

    <main>


        <?php

        if (isset($day)) {

            //El paso, sólo pasa cuando está bien la fecha solicitada

            //Calculando la masa inicial de días
            $totaldays = ($year - 1) * 365;

            //Añado los supuestos bisiestos 
            $b = ($year - 1) % 4;
            $totaldays = $totaldays + ($year - $b) / 4;

            //Resto los falsos bisiestos de 100, los años seculares
            $b = ($year - 1) % 100;
            $totaldays = $totaldays - ($year - $b) / 100;

            //Sumo los verdaderos bisiestos de 400 
            $b = ($year - 1) % 400;
            $totaldays = $totaldays + ($year - $b) / 400;

            //Añadir la parte del año en curso
            $yearcur = 0;

            if (($month - 1) == 11) {
                $yearcur = 334;
            } else if (($month - 1) == 10) {
                $yearcur = 304;
            } else if (($month - 1) == 9) {
                $yearcur = 273;
            } else if (($month - 1) == 8) {
                $yearcur = 243;
            } else if (($month - 1) == 7) {
                $yearcur = 212;
            } else if (($month - 1) == 6) {
                $yearcur = 181;  //Los famosos 181 días del primer semestre
            } else if (($month - 1) == 5) {
                $yearcur = 151;
            } else if (($month - 1) == 4) {
                $yearcur = 120;
            } else if (($month - 1) == 3) {
                $yearcur = 90;
            } else if (($month - 1) == 2) {
                $yearcur = 59;
            } else if (($month - 1) == 1) {
                $yearcur = 31;
            }

            if (((($year % 4 == 0) && ($year % 100 <> 0)) or (($year % 4 == 0) && ($year % 400 == 0))) && (($month - 1) >= 2)) {
                $yearcur = $yearcur + 1;
            }

            $yearcur = $yearcur + 1;
            $totaldays = $yearcur;

            //Calcular el día de la semana del 1 del mes. El 1 sería lunes
            $resto = $totaldays % 7;



            if (($month == 1) or ($month == 3) or ($month == 5) or ($month == 7) or ($month == 8) or ($month == 10) or ($month == 12)) {
                $maxdaycal = 31;
            }


            if (($month == 4) or ($month == 6) or ($month == 9) or ($month == 11)) {
                $maxdaycal = 30;
            }

            if (($month == 2)  &&  !((($year % 4 == 0) && ($year % 100 <> 0)) or (($year % 4 == 0) && ($year % 400 == 0)))) {
                $maxdaycal = 28;
            } else {

                $maxdaycal = 29;
            }

            // Un for para las semanitas, dentro de un while para el mes entero... y una bonita tabla para el todo
            //Ah, y un switch para variablear el nombre del mes

        ?>

            <table>
                <thead>

                    <th>L</th>
                    <th>M</th>
                    <th>X</th>
                    <th>J</th>
                    <th>V</th>
                    <th>S</th>
                    <th>D</th>

                </thead>

                <tr>
                <?php

                for ($i = 1; $i < $resto; $i++) {  //Esto para los días en blanco, si los hay
                    echo "<td>&nbsp;</td>";
                }

                $daycal = 1;
                for ($i = $resto; $i <= 7; $i++) {
                    echo "<td>{$daycal}</td>";
                    $daycal++;
                }

                echo "</tr>"; //Hasta aquí la primera semana. Si no fuera por estas etiquetas de cierre...


                //Necesito un nuevo resto, para sacar el cuadrado... la última semana irá aparte

                $resto2 = ($maxdaycal - $daycal / 7);
                $maxcuadrado = $maxdaycal - $resto2;
                while ($daycal <= $maxcuadrado) {

                    echo "<tr>";
                    for ($i = 1; $i <= 7; $i++) {
                        echo "<td>{$daycal}</td>";
                        $daycal++;
                    }
                    echo "</tr>";
                }

                //La última línea, a ver si consigo hacerla sin variables raras... Va sobre $resto2

                echo "<tr>";
                for ($i = 1; $i <= $resto2; $i++) {
                    echo "<td>{$daycal}</td>";
                    $daycal++;
                }

                for ($i = $resto2 + 1; $i <= 7; $i++) {  //Esto para los días en blanco, si los hay
                    echo "<td>&nbsp;</td>";
                }
                echo "</tr>";
            }


                ?>
    </main>

    <!-- Un for para las semanitas, dentro de un while para el mes entero... y una bonita tabla para el todo -->

    <br> <a href="../../../index.html"> Página principal </a>


    </table>

</body>

</html>


Ahora paso a revisar las formulitas, sin pruebas... Actualizo el isset, meto el cierre de la tabla donde creo que corresponde, añado el switch… Y a falta de probarlo el resultado es este:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> Calendario del mes </title>
</head>

<body>



    <header>

        <form action="index.php" method="post">
            <input type="number" name="month" id="month" min=1 max=12 step=1 placeholder="Mes">
            <input type="number" name="year" id="year" min=1 step=1 placeholder="Año">
            <input type="submit" value="Enviar">
        </form>

        <?php
        $month = $_POST['month'];
        $year = $_POST['year'];
        ?>

    </header>

    <main>


        <?php

        if (isset($month)) {

            //Calculando la masa inicial de días
            $totaldays = ($year - 1) * 365;

            //Añado los supuestos bisiestos 
            $b = ($year - 1) % 4;
            $totaldays = $totaldays + ($year - $b) / 4;

            //Resto los falsos bisiestos de 100, los años seculares
            $b = ($year - 1) % 100;
            $totaldays = $totaldays - ($year - $b) / 100;

            //Sumo los verdaderos bisiestos de 400 
            $b = ($year - 1) % 400;
            $totaldays = $totaldays + ($year - $b) / 400;

            //Añadir la parte del año en curso
            $yearcur = 0;

            if (($month - 1) == 11) {
                $yearcur = 334;
            } else if (($month - 1) == 10) {
                $yearcur = 304;
            } else if (($month - 1) == 9) {
                $yearcur = 273;
            } else if (($month - 1) == 8) {
                $yearcur = 243;
            } else if (($month - 1) == 7) {
                $yearcur = 212;
            } else if (($month - 1) == 6) {
                $yearcur = 181;  //Los famosos 181 días del primer semestre
            } else if (($month - 1) == 5) {
                $yearcur = 151;
            } else if (($month - 1) == 4) {
                $yearcur = 120;
            } else if (($month - 1) == 3) {
                $yearcur = 90;
            } else if (($month - 1) == 2) {
                $yearcur = 59;
            } else if (($month - 1) == 1) {
                $yearcur = 31;
            }

            if (((($year % 4 == 0) && ($year % 100 <> 0)) or (($year % 4 == 0) && ($year % 400 == 0))) && (($month - 1) >= 2)) {
                $yearcur = $yearcur + 1;
            }

            $yearcur = $yearcur + 1;
            $totaldays = $yearcur;

            //Calcular el día de la semana del 1 del mes. El 1 sería lunes
            $resto = $totaldays % 7;



            if (($month == 1) or ($month == 3) or ($month == 5) or ($month == 7) or ($month == 8) or ($month == 10) or ($month == 12)) {
                $maxdaycal = 31;
            }


            if (($month == 4) or ($month == 6) or ($month == 9) or ($month == 11)) {
                $maxdaycal = 30;
            }

            if (($month == 2)  &&  !((($year % 4 == 0) && ($year % 100 <> 0)) or (($year % 4 == 0) && ($year % 400 == 0)))) {
                $maxdaycal = 28;
            } else {

                $maxdaycal = 29;
            }

            // Un for para las semanitas, dentro de un while para el mes entero... y una bonita tabla para el todo
            //Ah, y un switch para variablear el nombre del mes

            switch ($month) {
                case 1:
                    $mes = "Enero";
                    break;
                case 2:
                    $mes = "Febrero";
                    break;
                case 3:
                    $mes = "Marzo";
                    break;
                case 4:
                    $mes = "Abril";
                    break;
                case 5:
                    $mes = "Mayo";
                    break;
                case 6:
                    $mes = "Junio";
                    break;
                case 7:
                    $mes = "Julio";
                    break;
                case 8:
                    $mes = "Agosto";
                    break;
                case 9:
                    $mes = "Septiembre";
                    break;
                case 10:
                    $mes = "Octubre";
                    break;
                case 11:
                    $mes = "Noviembre";
                    break;
                case 12:
                    $mes = "Diciembre";
                    break;
            }




        ?>

            <table>
                <caption> <?php echo "{$mes} de {$year}"; ?></caption>
                <thead>

                    <th>L</th>
                    <th>M</th>
                    <th>X</th>
                    <th>J</th>
                    <th>V</th>
                    <th>S</th>
                    <th>D</th>

                </thead>

                <tr>
                <?php

                for ($i = 1; $i < $resto; $i++) {  //Esto para los días en blanco, si los hay
                    echo "<td>&nbsp;</td>";
                }

                $daycal = 1;
                for ($i = $resto; $i <= 7; $i++) {
                    echo "<td>{$daycal}</td>";
                    $daycal++;
                }

                echo "</tr>"; //Hasta aquí la primera semana. Si no fuera por estas etiquetas de cierre...


                //Necesito un nuevo resto, para sacar el cuadrado... la última semana irá aparte

                $resto2 = ($maxdaycal - $daycal / 7);
                $maxcuadrado = $maxdaycal - $resto2;
                while ($daycal <= $maxcuadrado) {

                    echo "<tr>";
                    for ($i = 1; $i <= 7; $i++) {
                        echo "<td>{$daycal}</td>";
                        $daycal++;
                    }
                    echo "</tr>";
                }

                //La última línea, a ver si consigo hacerla sin variables raras... Va sobre $resto2

                echo "<tr>";
                for ($i = 1; $i <= $resto2; $i++) {
                    echo "<td>{$daycal}</td>";
                    $daycal++;
                }

                for ($i = $resto2 + 1; $i <= 7; $i++) {  //Esto para los días en blanco, si los hay
                    echo "<td>&nbsp;</td>";
                }
                echo "</tr>";

                echo "</table>";
            }


                ?>
    </main>

    <br> <a href="../../../index.html"> Página principal </a>



</body>

</html>


10: ok, el programa sabe pintar la primera línea, pero no qué día de la semana es el día 1 porque en este caso debería tener 1 de resto y no 6...

11: bien, parece que el cambio de nombre del archivo en local se traslada al servidor, no tengo que borrar aquí el fichero con el nombre antiguo.
Lo renombro porque me temo que tendré que ir haciendo una ejecución paso a paso, que se supone que no existe en VSCode… 
… por https://es.stackoverflow.com/questions/408124/puedo-ejecutar-mi-c%c3%b3digo-linea-por-linea-en-vs-code llego a 23, interesante...

24: aparece esto al seleccionar "Agregar configuración...", y no veo que me deje añadir los puntos de interrupción... Entiendo que estoy en aprender a depurar + arreglar el código... tal vez tarde menos centrándome en arreglar el código a mano. Es decir, formando paso a paso el index y lanzando echo's a ver qué pasa.

25: sale esto al dar en "Ejecución y depuración"... a pensar todo esto con la almohada, seguramente lo haga a mano pasando este index a una copia, además tengo que meter otro isset o modificar el existente...


*** Día 23/12/2025

61 y 62: ok, ok, voy a cambiar ese $totaldays = $yearcur; por el $totaldays = $totaldays + $yearcur; original, para no ignorar los días transcurridos hasta este 01/01/2025

63 y 64: ok, ya tengo bien el principio, ahora me queda saber por qué no me hace el cierre de los tr

67: parece que no concatena los inicio y cierre de tr's y el cierre de table cuando están con echo... me temo que será mejor jugar a desvincular la estructura de tabla del bloque php, a ver qué tal...
Por el resultado podría pensar que me reconoce el cierre de la primera semana, pero no la siguiente abertura... voy a ir rompiendo esto, a ver qué sale.

ESTADO ACTUAL, que vale hasta la tabla:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> Calendario del mes </title>
</head>

<body>



    <header>

        <form action="index.php" method="post">
            <input type="number" name="month" id="month" min=1 max=12 step=1 placeholder="Mes">
            <input type="number" name="year" id="year" min=1 step=1 placeholder="Año">
            <input type="submit" value="Enviar">
        </form>

        <?php
        $month = $_POST['month'];
        $year = $_POST['year'];
        ?>

    </header>

    <main>


        <?php

        if (isset($month)) {

            //Calculando la masa inicial de días
            $totaldays = ($year - 1) * 365;

            //Añado los supuestos bisiestos 
            $b = ($year - 1) % 4;
            $totaldays = $totaldays + ($year - $b) / 4;

            //Resto los falsos bisiestos de 100, los años seculares
            $b = ($year - 1) % 100;
            $totaldays = $totaldays - ($year - $b) / 100;

            //Sumo los verdaderos bisiestos de 400 
            $b = ($year - 1) % 400;
            $totaldays = $totaldays + ($year - $b) / 400;

            //Añadir la parte del año en curso
            $yearcur = 0;

            if (($month - 1) == 11) {
                $yearcur = 334;
            } else if (($month - 1) == 10) {
                $yearcur = 304;
            } else if (($month - 1) == 9) {
                $yearcur = 273;
            } else if (($month - 1) == 8) {
                $yearcur = 243;
            } else if (($month - 1) == 7) {
                $yearcur = 212;
            } else if (($month - 1) == 6) {
                $yearcur = 181;  //Los famosos 181 días del primer semestre
            } else if (($month - 1) == 5) {
                $yearcur = 151;
            } else if (($month - 1) == 4) {
                $yearcur = 120;
            } else if (($month - 1) == 3) {
                $yearcur = 90;
            } else if (($month - 1) == 2) {
                $yearcur = 59;
            } else if (($month - 1) == 1) {
                $yearcur = 31;
            }

            if (((($year % 4 == 0) && ($year % 100 <> 0)) or (($year % 4 == 0) && ($year % 400 == 0))) && (($month - 1) >= 2)) {
                $yearcur = $yearcur + 1;
            }

            $yearcur = $yearcur + 1;
            $totaldays = $totaldays + $yearcur;

            //Calcular el día de la semana del 1 del mes. El 1 sería lunes
            $resto = $totaldays % 7;



            if (($month == 1) or ($month == 3) or ($month == 5) or ($month == 7) or ($month == 8) or ($month == 10) or ($month == 12)) {
                $maxdaycal = 31;
            }


            if (($month == 4) or ($month == 6) or ($month == 9) or ($month == 11)) {
                $maxdaycal = 30;
            }

            if (($month == 2)  &&  !((($year % 4 == 0) && ($year % 100 <> 0)) or (($year % 4 == 0) && ($year % 400 == 0)))) {
                $maxdaycal = 28;
            } else {

                $maxdaycal = 29;
            }

            // Un for para las semanitas, dentro de un while para el mes entero... y una bonita tabla para el todo
            //Ah, y un switch para variablear el nombre del mes

            switch ($month) {
                case 1:
                    $mes = "Enero";
                    break;
                case 2:
                    $mes = "Febrero";
                    break;
                case 3:
                    $mes = "Marzo";
                    break;
                case 4:
                    $mes = "Abril";
                    break;
                case 5:
                    $mes = "Mayo";
                    break;
                case 6:
                    $mes = "Junio";
                    break;
                case 7:
                    $mes = "Julio";
                    break;
                case 8:
                    $mes = "Agosto";
                    break;
                case 9:
                    $mes = "Septiembre";
                    break;
                case 10:
                    $mes = "Octubre";
                    break;
                case 11:
                    $mes = "Noviembre";
                    break;
                case 12:
                    $mes = "Diciembre";
                    break;
            }




        ?>

            <table>
                <caption> <?php echo "{$mes} de {$year}"; ?></caption>
                <thead>

                    <th>L</th>
                    <th>M</th>
                    <th>X</th>
                    <th>J</th>
                    <th>V</th>
                    <th>S</th>
                    <th>D</th>

                </thead>

                <tr>
                <?php

                for ($i = 1; $i < $resto; $i++) {  //Esto para los días en blanco, si los hay
                    echo "<td>&nbsp;</td>";
                }

                $daycal = 1;
                for ($i = $resto; $i <= 7; $i++) {
                    echo "<td>{$daycal}</td>";
                    $daycal++;
                }

                echo "</tr>"; //Hasta aquí la primera semana. Si no fuera por estas etiquetas de cierre...


                //Necesito un nuevo resto, para sacar el cuadrado... la última semana irá aparte

                $resto2 = ($maxdaycal - $daycal / 7);
                $maxcuadrado = $maxdaycal - $resto2;
                while ($daycal <= $maxcuadrado) {

                    echo "<tr>";
                    for ($i = 1; $i <= 7; $i++) {
                        echo "<td>{$daycal}</td>";
                        $daycal++;
                    }
                    echo "</tr>";
                }

                //La última línea, a ver si consigo hacerla sin variables raras... Va sobre $resto2

                echo "<tr>";
                for ($i = 1; $i <= $resto2; $i++) {
                    echo "<td>{$daycal}</td>";
                    $daycal++;
                }

                for ($i = $resto2 + 1; $i <= 7; $i++) {  //Esto para los días en blanco, si los hay
                    echo "<td>&nbsp;</td>";
                }
                echo "</tr>";

                echo "</table>";
            }


                ?>
    </main>

    <br> <a href="../../../index.html"> Página principal </a>



</body>

</html>


71 y 72: eh, a lo mejor la tabla funciona bien, porque mira estas variables. Las variables están mal, por de pronto...

Veo 73... ok, ok, por un lado entiendo que me aplicará el else en todos los casos, sea febrero o no, aunque mi idea era que este if...else sólo funcionara para febrero. Y por otro veo de pronto en 71 que ese                 $resto2 = ($maxdaycal - $daycal / 7); no tiene sentido, eso no es un módulo... ok, a reestructurar

(75: pues no, al final no me hace espacios)

77: cambio eso a $resto2 = ($maxdaycal - $daycal) % 7; y actualizo... y tachán, en 80 veo que me funciona la tabla. Venga, a cambiar ese if...else


            if ($month == 2) {
                if (!((($year % 4 == 0) && ($year % 100 <> 0)) or (($year % 4 == 0) && ($year % 400 == 0)))) {
                    $maxdaycal = 28;
                } else {
                    $maxdaycal = 29;
                }
            }

Cambio a lo anterior y actualizo... y llego a 87. El resultado no es bueno, pero es mejor. Ah, en 90 me hago a la idea de lo que pasa, creo que:

                $daycal = 1;
                for ($i = $resto; $i <= 7; $i++) {
                    echo "<td>{$daycal}</td>";
                    $daycal++;
                }

… tengo esto que me hace 7 días, así que acaba en que $daycal=8, por eso 31-8=23 y al dividir entre 7 me da resto 2.
Es decir, para un cálculo correcto de ese resto tengo que usar $daycal-1


Paso $resto2 = ($maxdaycal - $daycal) % 7; a                 $resto2 = ($maxdaycal - $daycal - 1) % 7; y a ver qué tal
118: pues no, me rebaja ese $resto2... claro, si le resto 1 pues me resta... en 121 lo paso a                 $resto2 = ($maxdaycal - ($daycal - 1)) % 7; para que me sume al resultado en vez de restar, actualizo... y de pronto en 122 me sale el calendario bonito, al menos para este mes de diciembre de 2025. Ya sólo me queda meterle el CSS, aunque veré si me queda aparte alguna cosa más por tocar


140: esto de   <h4><a href="/html/fotos/fotos.zip" download="fotos.zip">Enlace de descarga</a></h4>
… pero en mi caso era que no había subido la carpeta al servidor, y CUIDADO que me pasa con otros zip... habrá que subir todo el bloque, tal vez. Si quiero que se descargue, claro


*** Día 07/01/2026

*** De preguntas y

El rombo efectivamente era sólo alinear triángulos en CSS, sin código especial

Proyecto 2-3 semanas, si nos sobramos nos dará indicación de tal
Cada examen es de cada módulo, trámite como el primero

***

LA HOJA lleva el contenido... pero cuidado con la diferencia entre llaves, paréntesis y corchetes, puede no ser exacto lo escrito en ese sentido.

***

LA HOJA:

Como no hay conexión a Internet en la sala, Alfonso decide ir haciendo el ejercicio del calendario usando Javascript:

En Javascript podemos definir variables con let, var o sin comando, pero mejor usar let
EJ: let mes=1;

console.log (esBisiesto(2026)); guarda el resultado en la consola del navegador (accesible desde Inspeccionar)
Es como el print_r de PHP
Podemos usar los console.log en diferentes partes del código para ir depurando errores

La etiqueta para usar JS en VSCode es <script> </script>

Ejemplos de array:
let meses = [31,28,31];
let nombre_meses = ["ENERO", "FEBRERO", "MARZO"];

Con <script src="jq.js"> </script> podemos usar jq.js como librería (según lo que lleve dentro, claro), y por ejemplo trabajar sin conexión

$("#nombremes").html(nombre_meses[mes-1]); da el nombre del mes, y lo pone en el caption de id nombremes

La variable $mes de PHP en JS pasa a llamarse mes
Los comentarios van precedidos de //

Incluso podemos meter en una variable una línea de tabla:
let tabla = '<tr>
		<td> hola </td>
	     </tr>';
Una línea de tabla o una tabla entera, sumándole partes como quien suma valores

Ejercicio de la hoja de calendario: ok, pone los espacios iniciales como yo, las celdas en blanco... pero cuidado cuando el día 1 es domingo

Desde la consola (Inspeccionar-Consola) podemos llamar en JS a una variable para ver su valor

En JS no se concatena con punto como en PHP, es con + en vez de con punto.
(Y además está la otra forma de concatenar, como en PHP, la que en PHP llama a las variables con {})

JS manda sólo código al ver el código fuente, no resultados porque eso se ejecuta desde el lado del cliente. Además el resultado lo podemos guardar en un json que quede en la caché del cliente

La mayoría de las aplicaciones web actuales usan cookies (ficheros que el servidor guarda en el cliente). Son ficheros de texto encriptados, de máximo 33 KB.
Van personalizadas para un usuario de equipo y navegador, y para esa web concreta

El problema está en que pueden leer esa información y tipificarte según dónde vas entrando y qué vas mirando, hay una contínua interacción servidor-cliente

Una web no puede leer las cookies de otra, aunque en el código puedo usar una jQuery de otros (como el jq.js de antes), y ese js sí puede crear sus propias cookies donde almacenan información
Y usando la misma jQuery en muchos sitios se va sumando información de muchos sitios, que al ser suya sí pueden vender
Y se almacena en sus servidores.
Esto desemboca en que sacan banners de eso en diferentes webs. Banners que la web ha vendido como espacio publicitario y que son un JS. Se pasa de publicidad contextual a por intereses.

La cookie sólo la puede leer el dominio que la creó


mes = $("#mes").val();
Viniendo mes del id de un select (También podríamos hacer referencia a un input)

En mi caso, en mi programa, en mi código... confirmar con mayo/2026 si me hace 7 celdas más abajo, si me saca una línea más de tabla vacía (en su caso lo resuelve pasando un if de <7 a !=0)
(En este caso da igual poner !=0 o !==0, en la negación)

Valores por defecto de una función: definidos al inicio de la función, en su declaración, son los valores que tomaría si lanzas la función sin enviar nada. Te permite operar con ella de 2 formas: con ellos o con los enviados (desde algún input, por ejemplo)

A la función de eliminarMes le aplica varias cosas, para experimentar:
- hide("slow")
- lo anterior pero añadiendo el tbody tras +mes, para conservar el hueco que desaparecía antes
- la atenuación
- la línea 44 para poder reactivarlos y luego el if mesesActivos

if (festivos [dd][0]… se referiría al 1 si el primer valor del array fuera [1,5,2026]


(REV, quedaría meter aquí el código del programa del calendario de Alfonso, o al menos guardarlo junto con el manual. Para que esto tenga más sentido, digo)


CALENDARIO FINAL:
<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Dibujar Mes</title>
    <link rel="stylesheet" href="style.css">
    <script src="jq.js"></script>
</head>

<body>

    <div style="background-color: aliceblue;">
        <select id="mes">
            <option value="1">ENERO</option>
            <option value="2">FEBRERO</option>
            <option value="3">MARZO</option>
            <option value="4">ABRIL</option>
            <option value="5">MAYO</option>
            <option value="6">JUNIO</option>
            <option value="7">JULIO</option>
            <option value="8">AGOSTO</option>
            <option value="9">SEPTIEMBRE</option>
            <option value="10">OCTUBRE</option>
            <option value="11">NOVIEMBRE</option>
            <option value="12">DICIEMBRE</option>
        </select>
        <input type="number" id="year" min="1" placeholder="Año">
        <button onclick="pintarMes();">Pintar Mes</button>
    </div>

    <div style="background-color: orange;">
        <input type="number" id="ano" min="1" placeholder="Año">
        <button onclick="pintarYear();">Pintar Año</button>
    </div>

    <div id="zonadepintado">Aquí no hay nada de momento</div>

    <script>
        let mes = -1;
        let year = -1;
        let meses = [31, 28 + esBisiesto(year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
        let mesesActivos = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
        let nombre_meses = ["ENERO", "FEBRERO", "MARZO", "ABRIL", "MAYO", "JUNIO", "JULIO", "AGOSTO", "SEPTIEMBRE", "OCTUBRE", "NOVIEMBRE", "DICIEMBRE"];

        let festivos = [
            [6, 1, 2026], [15, 8, 2026], [1, 1, 2026], [1,5,2026]
        ]


        function pintarMes(mes = 0, year = 0) {
            let dia1 = -1;
            let mess = mes;
            let yearr = year;

            if (mes == 0) {
                mess = $("#mes").val();
            } 
            if (year == 0) {
                yearr = $("#year").val();
            } 

            let textohtml = `
                    <table id='mes_${mess}'>
                    <caption>${nombre_meses[mess - 1]} <button onclick='elimintarMes(${mess})'> X </button></caption>
                    <thead>
                        <tr>
                            <th>L</th>
                            <th>M</th>
                            <th>X</th>
                            <th>J</th>
                            <th>V</th>
                            <th>S</th>
                            <th>D</th>
                        </tr>
                    </thead>
                    <tbody><tr>`;

            let contadorCeldas = 0;

            dia1 = contarDias(1, mess, yearr) % 7;

            if (dia1 == 0) {
                dia1 = 7;
            }

            for (let d = 1; d < dia1; d++) {
                textohtml += "<td></td>";
                contadorCeldas++;
            }

            for (let d = 1; d <= meses[mess - 1]; d++) {
                let clase = "";
                for (let dd = 0; dd < festivos.length; dd++) {
                    if(festivos[dd][0] == d && festivos[dd][1] == mess && festivos[dd][2] == yearr){
                        clase = " class='festivo' ";
                    }
                }
                textohtml += "<td " + clase + " >" + d + "</td>";
                contadorCeldas++;
                if (contadorCeldas == 7) {
                    textohtml += "</tr><tr>";
                    contadorCeldas = 0;
                }
            }

            if (contadorCeldas != 0) {
                for (let d = contadorCeldas; d < 7; d++) {
                    textohtml += "<td></td>";
                }
            }
            textohtml += "</tr></tbody></table>";

            if (mes == 0 && year == 0) {
                $("#zonadepintado").html(textohtml);
            } else {
                return textohtml;
            }
        }


        function pintarYear() {
            year = $("#ano").val();
            let html = "<h1>" + year + "</h1><div>";
            for (let m = 1; m <= 12; m++) {
                html += pintarMes(m, year);
            }
            html += "</div>";
            $("#zonadepintado").html(html);
        }


        function esBisiesto(ano) {
            if ((ano % 4 == 0 && ano % 100 != 0) || ano % 400 == 0) {
                return 1;
            } else {
                return 0;
            }
        }

        function contarDias(dia, mes, year) {
            total = dia;
            year--;
            total += year * 365;
            total += (year - (year % 4)) / 4;
            total -= (year - (year % 100)) / 100;
            total += (year - (year % 400)) / 400;

            meses[1] = 28 + esBisiesto(year);
            for (let m = 1; m < mes; m++) {
                total += meses[m - 1];
            }
            return total;
        }


        function elimintarMes(mes) {
            if (mesesActivos[mes - 1] == 1) {
                $("#mes_" + mes).css("color", "rgb(237, 237, 237)");
                mesesActivos[mes - 1] = 0;
            } else {
                $("#mes_" + mes).css("color", "black");
                mesesActivos[mes - 1] = 1;
            }

        }
    </script>

</body>

</html>

EL CSS:
table{
    border: 1px solid black;
    margin: auto;
    font-family: Verdana, Geneva, Tahoma, sans-serif;
}

table td{
    border: 1px solid gainsboro;
    padding: 8px;
    font-size: 2em;
    text-align: center;
}
table td:hover{
    background-color: black;
    color: white;
}

table td:last-child{
    color: red;
}

.festivo {
    color: red;
}

#zonadepintado>div{
    display: grid;
    grid-template-columns: 1fr 1fr 1fr;
}


*** Día 08/01/2026

Volvemos sobre el ejercicio del calendario de ayer, lo analizamos una vez que está hecho.

Expresión de los festivos en el array:
let festivos={
[1,1,2026],[15,8,2026],[25,12,2026]
}

Al ser un programa en Javascript no se envía nada al servidor, asñi que en Inspeccionar-Red no se ve nada

button onclick = "pintarMes();"
button onmouseenter = "pintarMes();"
La función pintarMes se ejecuta en el primer caso al pinchar en el botón, y en el segundo al pasar el ratón por encima

También está onload, que es la acción que se da cuando se carga algo... Hay muchos eventos disponibles, pero los que se usan masivamente son pocos, onclick y alguno más

Se usa def en python y en VBasic para definir funciones, en vez de function


function a ($min,$max){

líneas de código
return...

}

Return sólo se usará si queremos que devuelva algo, por ejemplo hacia $n, poniendo $n=a(1,10)

function a ($min=0,$max=10): expresión usando valores por defecto, por ejemplo para poder usar $n=a(8)

Al ponernos con el ratón sobre el nombre de la función y pulsar Ctrl nos saca un hipervínculo: además de ver ahí mismo la estructura de la función, si pinchamos nos lleva a su código, a las líneas de código donde la hemos definido

En VSCode tenemos en la columna izquierda el apartado Esquema: ahí nos saca la estructura del archivo, y podremos pinchar para ir a cualquier punto del mismo.

Si usamos variables de igual nombre priman las de la función sobre las de fuera... Mejor usar variables de diferente nombre


mess=$("#mes").val();   coge el valor del select (o input) de id="mes" y lo almacena en la variable mess

Podemos usar <table id = 'mes_$(mess)'>
	     <caption>${nombre_meses[mess-1]}

$("#zonadepintado").HTML(textohtml);
De esta forma en el div de id="zonadepintado" pintamos el contenido de la variable textohtml

La parte de JS, lo incluido en las etiquetas <script> </script>, debe estar dentro de una estructura HTML



Desde Jose, para actualización desde Terminal de Debian:
-su
apt upgrade


EJERCICIO DE ARRAYS:

https://www.interior.gob.es/opencms/es/servicios-al-ciudadano/tramites-y-gestiones/dni/calculo-del-digito-de-control-del-nif-nie/

T,R,W,A,G,M,Y,F,P,D,X,B,N,J,Z,S,Q,V,H,L,C,K,E

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> Letra NIF</title>
</head>

<body>

    <form action="index.php" method="post">
        <input type="number" name="dni" id="dnu" max=99999999 step=1 placeholder="DNI sin letra">
        <input type="submit" value="Enviar">
    </form>

    <?php
    $letra = ['T', 'R', 'W', 'A', 'G', 'M', 'Y', 'F', 'P', 'D', 'X', 'B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'E'];
    $mod = $_POST['dni'] % 23;
    echo "<br><br> La letra de NIF que le corresponde a ese DNI es " . $letra[$mod];
    ?>



</body>

</html>



const es una constante que no puedes cambiar el valor, a menos que la redirijas. Es como una variable fija



Desde consulta de Jose a Alfonso:
Administrar aplicaciones web de Virtualmin - tiene Wordpress, y puedes seleccionar el subdirectorio de instalación


*** Día 09/01/2026

IFC0109 de 18:30 a 21:30 el curso de seguridad informática que da ahora, que empieza el L12 con Alfonso... Unas 520 horas cree que era

Con VSCode ha comenzado a espiarnos Microsoft, a ponerle la IA Copilot, tiene una serie de telemetrías para ver lo que haces por si a ellos les interesa... y al profesor no le mola, así que prefiere mirar VSCodium 

Marcos: los coches mejor llevarlos a un taller de confianza, porque los talleres...
Leli: Pelayo ya no te atiende una persona, te mandan a un bot, te hace un cuestionario por whatsapp y te envían a quien sea y...

Codium viene en la tienda de Ubuntu
Tiene código 100% libre, como Debian. La base es VSCode, pero restringe los añadidos propietarios (de código cerrado, de pago...), restringe esas extensiones

50, 51: tras instalar las extensiones correspondientes basta con abrir la carpeta y sincronizar... nada más

NetBeans pasó de Oracle a la comunidad Apache, y no lo actualizan mucho, y requiere la Java 8, que es antigua... y Alfonso lo ha dejado

65: editor de texto muy bueno, pero no tiene tantos plugins como VSCode, y pesa menos que Eclipse

66 a 69: es la versión de pago la buena, la Idea es la gratuita pero no es tan buena

MySQL fue comprado para dejarlo morir poco a poco, y entonces la comunidad Apache sacó MariaDB, los de antes siguieron con su proyecto pero llamado de otra forma, sin alianzas ya con Oracle.

nextcloud es la matriz de clouding

83: los cursos pasa a llevarlos el ministerio, ya no las comunidades

90: podemos probar eso por si está ese repositorio disponible en Debian

Sobre 94: tratamiento de copiar y pegar con el multicursor

99: Pasamos a hacer el ejercicio con JS

Función cargadora: es la que se ejecuta cuando todo el código de la página ya se ha ejecutado. Podemos meter un onload como en el 100 o llevar la etiqueta <script> al final

101: hacemos referencia al id del input

La primera opción creo que era en jQuery, 108 era JS puro

No podemos sustituir document (todo el archivo) por el id de un div

Las constantes se definen por const, no cons como puse ayer

109: al dar al tabulador se produce el evento onchange

111: onkeyup: según vas escribiendo se produce el evento, según se ve en la consola

let es la forma moderna de definir variables

117: lo va haciendo en tiempo real, según vas escribiendo te va cambiando la letra. Es una forma más dinámica de trabajar, desde el lado del cliente

Podemos definir diferentes eventos a la vez, cada uno lanza código JS

119: esa forma de añadir código se sustituye por una función

120: para cada evento podemos ejecutar varias funciones

En este caso no hemos necesitado ningún return

PHP se suele usar más para la interacción con la BD, el resto se hace en JS


https://javier.avisando.com/php/arrays/ejercicios.html

EJERCICIOS 11:20 aprox
1 Ejercicio 
Realizar un programa que defina un vector llamado “vector_numeros” de 10 enteros, a continuación lo inicialice con valores aleatorios (del 1 al 10) y posteriormente muestre en pantalla cada elemento del vector junto con su cuadrado y su cubo.

2 Ejercicio 
Crear un vector de 5 elementos de cadenas de caracteres, inicializa el vector con datos leídos por el teclado. Copia los elementos del vector en otro vector pero en orden inverso, y muéstralo por la pantalla.

3 Ejercicio 
Se quiere realizar un programa que rellene las 10 notas obtenidas por un alumno (comprendidas entre 0 y 10) al azar. A continuación debe mostrar todas las notas, la nota media, la nota más alta que ha sacado y la menor.

4 Ejercicio 


5 Ejercicio 
Hacer un programa que inicialice un vector de 100 números con valores aleatorios enteros del 0 al 150, y posterior ordene los elementos de menor a mayor. SIN usar funciones nativas de ordenación

6 Ejercicio 


7 Ejercicio 


8 Ejercicio 

9 Ejercicio 


10 Ejercicio 
Diseñar el algoritmo correspondiente a un programa, que:

Crea una tabla bidimensional de longitud 5x5 y nombre ‘matriz’.
Carga la tabla con valores numéricos enteros.
Suma todos los elementos de cada fila y todos los elementos de cada columna visualizando los resultados en pantalla.

11 Ejercicio 

12 Ejercicio 
Diseñar el algoritmo correspondiente a un programa, que:

Crea una tabla bidimensional de longitud 5x15 y nombre ‘marco’.
Carga la tabla con dos únicos valores 0 y 1, donde el valor uno ocupará las posiciones o elementos que delimitan la tabla, es decir, las más externas, mientras que el resto de los elementos contendrán el valor 0.

  111111111111111
  100000000000001
  100000000000001
  100000000000001
  111111111111111
Visualiza el contenido de la matriz en pantalla.

13 Ejercicio 


14 Ejercicio 
Crear un programa que lea los precios de 5 artículos y las cantidades vendidas por una empresa en sus 4 sucursales. Informar:

Las cantidades totales de cada articulo.
La cantidad de artículos en la sucursal 2.
La cantidad del articulo 3 en la sucursal 1.
La recaudación total de cada sucursal.
La recaudación total de la empresa.
La sucursal de mayor recaudación.


https://javier.avisando.com/php/arrays/ejercicios.html

EJERCICIOS 11:20 aprox
1 Ejercicio 
Realizar un programa que defina un vector llamado “vector_numeros” de 10 enteros, a continuación lo inicialice con valores aleatorios (del 1 al 10) y posteriormente muestre en pantalla cada elemento del vector junto con su cuadrado y su cubo.

2 Ejercicio 
Crear un vector de 5 elementos de cadenas de caracteres, inicializa el vector con datos leídos por el teclado. Copia los elementos del vector en otro vector pero en orden inverso, y muéstralo por la pantalla.

3 Ejercicio 
Se quiere realizar un programa que rellene las 10 notas obtenidas por un alumno (comprendidas entre 0 y 10) al azar. A continuación debe mostrar todas las notas, la nota media, la nota más alta que ha sacado y la menor.

4 Ejercicio 


5 Ejercicio 
Hacer un programa que inicialice un vector de 100 números con valores aleatorios enteros del 0 al 150, y posterior ordene los elementos de menor a mayor. SIN usar funciones nativas de ordenación

6 Ejercicio 


7 Ejercicio 


8 Ejercicio 

9 Ejercicio 


10 Ejercicio 
Diseñar el algoritmo correspondiente a un programa, que:

Crea una tabla bidimensional de longitud 5x5 y nombre ‘matriz’.
Carga la tabla con valores numéricos enteros.
Suma todos los elementos de cada fila y todos los elementos de cada columna visualizando los resultados en pantalla.

11 Ejercicio 

12 Ejercicio 
Diseñar el algoritmo correspondiente a un programa, que:

Crea una tabla bidimensional de longitud 5x15 y nombre ‘marco’.
Carga la tabla con dos únicos valores 0 y 1, donde el valor uno ocupará las posiciones o elementos que delimitan la tabla, es decir, las más externas, mientras que el resto de los elementos contendrán el valor 0.

  111111111111111
  100000000000001
  100000000000001
  100000000000001
  111111111111111
Visualiza el contenido de la matriz en pantalla.

13 Ejercicio 


14 Ejercicio 
Crear un programa que lea los precios de 5 artículos y las cantidades vendidas por una empresa en sus 4 sucursales. Informar:

Las cantidades totales de cada articulo.
La cantidad de artículos en la sucursal 2.
La cantidad del articulo 3 en la sucursal 1.
La recaudación total de cada sucursal.
La recaudación total de la empresa.
La sucursal de mayor recaudación.


https://javier.avisando.com/php/arrays/ejercicios.html

EJERCICIOS 11:20 aprox, PRIMERA VERSIÓN
1 Ejercicio 
Realizar un programa que defina un vector llamado “vector_numeros” de 10 enteros, a continuación lo inicialice con valores aleatorios (del 1 al 10) y posteriormente muestre en pantalla cada elemento del vector junto con su cuadrado y su cubo.

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

    <!-- 
Realizar un programa que defina un vector llamado “vector_numeros” de 10 enteros,
a continuación lo inicialice con valores aleatorios (del 1 al 10)
y posteriormente muestre en pantalla cada elemento del vector junto con su cuadrado y su cubo.
 -->

    <?php

    $vector_numeros = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0];

    for ($i = 0; $i < 10; $i++) {
        $vector_numeros[$i] = rand(1, 10);
    }

    ?>

    <table>
        <thead>
            <th>ELEMENTO</th>
            <th>CUADRADO</th>
            <th>CUBO</th>
        </thead>

        <?php

        for ($i = 0; $i < 10; $i++) {
            echo "<tr>";
            echo "<td>{$vector_numeros[$i]}</td>";
            echo "<td>{$vector_numeros[$i]**2}</td>";
            echo "<td>{$vector_numeros[$i]**3}</td>";
echo "</tr>";
        }

        ?>



    </table>



</body>

</html>

Parece que no funciona el ^ de Basic para las potencias.


2 Ejercicio 
Crear un vector de 5 elementos de cadenas de caracteres, inicializa el vector con datos leídos por el teclado. Copia los elementos del vector en otro vector pero en orden inverso, y muéstralo por la pantalla.

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Ej 090126 2</title>
</head>

<body>

    <!-- 
Crear un vector de 5 elementos de cadenas de caracteres,
inicializa el vector con datos leídos por el teclado.
Copia los elementos del vector en otro vector pero en orden inverso, y muéstralo por la pantalla.
 -->

    <form action="index.php" method="post">
        <?php
        for ($i = 0; $i < 5; $i++) {
        ?>

            <input type="text" name="cadena <?php echo $i; ?>" placeholder="Ponme algo, niño" required>
        <?php } ?>

        <input type="submit" value="Enviar">
    </form>

    <br> Aquí lo ponemos al revés: <br>

    <?php
    for ($i = 0; $i < 5; $i++) {
        $vector1[$i] = $_POST['cadena.$i'];
        $j = 4 - $i;
        $vector2[$i] = $_POST['cadena.$j'];
        echo $vector2[$i];
    }
    ?>

<!-- ¿Se puede hacer un echo global para el vectorcito completo? -->


</body>

</html>


3 Ejercicio 
Se quiere realizar un programa que rellene las 10 notas obtenidas por un alumno (comprendidas entre 0 y 10) al azar. A continuación debe mostrar todas las notas, la nota media, la nota más alta que ha sacado y la menor.

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Ej 090126 3</title>
</head>

<body>

    <!-- 
Se quiere realizar un programa que rellene las 10 notas obtenidas por un alumno (comprendidas entre 0 y 10) al azar.
A continuación debe mostrar todas las notas, la nota media, la nota más alta que ha sacado y la menor.
-->

    <?php
    $mayor = 0;
    $menor = 10;
    $suma = 0;

    for ($i = 1; $i < 11; $i++) {
        $nota[$i - 1] = rand(0, 10);
        echo "Nota" . $i . ":" . $nota[$i - 1] . "<br>";
        $suma += $nota[$i - 1];
        /* Confirmar si lo anterior está bien expresado */

        if ($nota[$i - 1] > $mayor) {
            $mayor = $nota[$i - 1];
        }
        if ($nota[$i - 1] < $menor) {
            $menor = $nota[$i - 1];
        }
    }


    echo "<br>NOTA MEDIA:" . $suma / 10;
    echo "<br>NOTA MÁS ALTA:" . $mayor / 10;
    echo "<br>NOTA MENOR:" . $menor / 10;

    ?>


</body>

</html>

4 Ejercicio 


5 Ejercicio 
Hacer un programa que inicialice un vector de 100 números con valores aleatorios enteros del 0 al 150, y posterior ordene los elementos de menor a mayor. SIN usar funciones nativas de ordenación

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Ej 090126 5</title>
</head>

<body>

    <!--
Hacer un programa que inicialice un vector de 100 números con valores aleatorios enteros del 0 al 150,
y posterior ordene los elementos de menor a mayor. SIN usar funciones nativas de ordenación
-->

    <?php

    for ($i = 0; $i < 100; $i++) {
        $valor[$i] = rand(0, 150);
    }


    for ($i = 0; $i < 100; $i++) {
        $ordenado[$i] = 0;
        for ($j = 0; $j < 100; $j++) {
            if ($valor[$j] > $ordenado[$i]) {
                $ordenado[$i] = $valor[$j];
                $definitivo = $j;
            }
        }
        $valor[$definitivo] = -1;
    }

    ?>

</body>

</html>




6 Ejercicio 


7 Ejercicio 


8 Ejercicio 

9 Ejercicio 


10 Ejercicio 
Diseñar el algoritmo correspondiente a un programa, que:

Crea una tabla bidimensional de longitud 5x5 y nombre ‘matriz’.
Carga la tabla con valores numéricos enteros.
Suma todos los elementos de cada fila y todos los elementos de cada columna visualizando los resultados en pantalla.


<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Ej 090126 10</title>
</head>

<body>

    <!-- 
Crea una tabla bidimensional de longitud 5x5 y nombre ‘matriz’.
Carga la tabla con valores numéricos enteros.
Suma todos los elementos de cada fila y todos los elementos de cada columna visualizando los resultados en pantalla.
-->

    <?php

    $k = 1;
    for ($i = 0; $i < 5; $i++) {
        for ($j = 0; $j < 5; $j++) {
            $celda[$k] = rand(1, 10);
            $k++;
        }
    }


    echo "<table>";
    echo "<caption>MATRIZ</caption>";
    $k = 1;
    $suma = 0;

    for ($i = 0; $i < 5; $i++) {
        echo "<tr>";
        $sumlin[$i] = 0;
        for ($j = 0; $j < 5; $j++) {
            echo "<td>" . $celda[$k] . "</td>";
            $sumlin[$i] += $celda[$k];
            $k++;
        }

        echo "<td>" . $sumlin[$i] . "</td></tr>";
        $suma += $sumlin[$i];
    }

    echo "<tr>";

    for ($i = 0; $i < 5; $i++) {
        echo "<td>" . $sumlin[$i] . "</td>";
    }

    echo "<td>" . $suma . "</td></tr></table>";


    ?>


</body>

</html>

Meto $k porque $i+$j no es representativo, me lleva a duplicidades que no puedo permitir


11 Ejercicio 

12 Ejercicio 
Diseñar el algoritmo correspondiente a un programa, que:

Crea una tabla bidimensional de longitud 5x15 y nombre ‘marco’.
Carga la tabla con dos únicos valores 0 y 1, donde el valor uno ocupará las posiciones o elementos que delimitan la tabla, es decir, las más externas, mientras que el resto de los elementos contendrán el valor 0.

  111111111111111
  100000000000001
  100000000000001
  100000000000001
  111111111111111
Visualiza el contenido de la matriz en pantalla.

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Ej 090126 12</title>
</head>

<body>

    <!-- 
Crea una tabla bidimensional de longitud 5x15 y nombre ‘marco’.
Carga la tabla con dos únicos valores 0 y 1, donde el valor uno ocupará las posiciones o elementos que delimitan la tabla,
es decir, las más externas, mientras que el resto de los elementos contendrán el valor 0.

  111111111111111
  100000000000001
  100000000000001
  100000000000001
  111111111111111
Visualiza el contenido de la matriz en pantalla.
 -->

    <?php

    $k = 1;

    for ($i = 0; $i < 5; $i++) {
        for ($j = 0; $j < 15; $j++) {
            $celda[$k] = 0;
            if (($i == 1) or ($i == 5) or ($j == 1) or ($j == 15)) {
                $celda[$k] = 1;
            }
            $k++;
        }
    }

    echo "<br><br>";
    $k = 1;
    for ($i = 0; $i < 5; $i++) {
        for ($j = 0; $j < 15; $j++) {
            echo $celda[$k];
            $k++;
        }
        echo "<br>";
    }
/* Si esto no funciona (si no me une los números de cada línea) me queda ponerlo en modo tabla */

    echo "<br>";

    ?>


</body>

</html>


Me queda ver cómo se configuran en PHP variables bidimensionales, tal vez me vendría bien

13 Ejercicio 


14 Ejercicio 
Crear un programa que lea los precios de 5 artículos y las cantidades vendidas por una empresa en sus 4 sucursales. Informar:

Las cantidades totales de cada articulo.
La cantidad de artículos en la sucursal 2.
La cantidad del articulo 3 en la sucursal 1.
La recaudación total de cada sucursal.
La recaudación total de la empresa.
La sucursal de mayor recaudación.


*** Día 12/01/2026

14 Ejercicio 
Crear un programa que lea los precios de 5 artículos y las cantidades vendidas por una empresa en sus 4 sucursales. Informar:

Las cantidades totales de cada articulo.
La cantidad de artículos en la sucursal 2.
La cantidad del articulo 3 en la sucursal 1.
La recaudación total de cada sucursal.
La recaudación total de la empresa.
La sucursal de mayor recaudación.



19 es un array vacío. PHP nos permite que el array crezca o decrezca, en C o Java el tamaño del array debe ser fijo, y todos los elementos del mismo tipo
25 lleva a 24, tras añadir la etiqueta pre

Con los corchetes vacíos dentro del for los valores se añaden al final
En Java o C las keys no pueden ser alfanuméricas

34: la función pow sirve para calcular potencias

40: parece que no hace falta la etiqueta php dentro del name para definirlo como array

48: $_POST ya es un array, así que tenemos un array formado por arrays

52: Parece que los pone de primera a última posición, que el nuevo vector lo rellena así... aunque eso cuadra con que siempre rellene desde la última posición y vaya moviendo el resto de elementos dentro del array

Teclado mecánico. Puedes cambiar el juego de teclas sin más

82 es Ctrl+Clic sobre el sort y vemos su código interno


el curso 0109 de seguridad informática, 18:30 a 21:30, es muy flexible pero difícil de dar
ataque ssl, de denegación de servicio, de robo de sesión a través de variables de sesión, sql inject
Para seguridad informática necesitas conocer s.o., redes, bbdd, programación
En exploit usas algo que ya ha hecho otro
La hoja 1 es pentesting, para descubrir vulnerabilidades
Python le parece más simple que C y Java
El protocolo SSH comenta que es bastante atacable


209: ahhhh, lo de input:number me saldría mal por anteponerle <, creo
211: cambio de comillas para 212
215 lleva a 214
221 lleva a los dos anteriores

Sobre 233 llegamos a foreach
234: eso es $values, $keys es cada vuelta, es lo que aparece justo encima del bloque
Revisar 239 por el uso de foreach, también disponible en https://www.php.net/manual/es/control-structures.foreach.php

En 248 se saca el echo para llegar a 249

El futuro (tercer módulo del curso):
arrays y guardar información
bbdd 2,5 a 3 semanas
programación orientada a objetos
10-15 días el pequeño proyecto
(creo que es 4, o si no 3, lo que dice que llevará bastante JS)

264: ejercicio: fabricar el bombo del bingo, y simular el panel que se va iluminando con los números cantados, con números del 0 al 89
Meterle el cartón ya sería más complicado


*** Día 13/01/2026

Este viernes hay clase presencial, la semana que viene el jueves es online



UF2177

Desarrollo de programas en el entorno de la base de datos

Formador/a o responsable: ALFONSO JAVIER GIL LLAMAS

|) Denominación de la prueba práctica: Creación de una aplicación de gestión de tareas a modo agenda
2) Objetivos específicos a los que responde la practica (capacidades) Valorar las destrezas prácticas
3) Definición de la práctica:

◦
Descripción:

Debe crear una aplicación que gestione las tareas que deben realizar los trabajadores de
una empresa.
La aplicación debe tener dos tipos de usuari@s... trabajadores y administrador.
Por poner un ejemplo, imaginemos que tenemos una empresa de reparación de
electrodomésticos..., la empresa tiene en plantilla 4 técnic@s y una administrativa que se
encargar entre otras cosas de distribuir la carga
de trabajo entre los operarios, ella recibe
las llamadas y va completando la agenda de cada operario, les va asignado el trabajo a
realizar día a día y en qué momentos del día deben ir..., los operarios al entrar en la app
pueden revisar sus tareas, día, hora, lugar y descripción del problemas... una vez que han
ido el operario si puede dejar constancia de sus operaciones, si se ha terminado y tiene
que volver, etc,

Lo deberá colgar en su servidor en un directorio Ilamado "exámenes" que cuelgue del raiz,
dentro de otra carpeta Ilamada "2"... por ejemplo:


18: la ! del segundo if como que no. Puedo probar que distinto a, ya, pero insistiré en la !
if (isset ($_POST['usuario']) and ($_POST['usuario']=="admin")){

    echo "Admin commands";

}


if (isset ($_POST['usuario']) and (!$_POST['usuario']=="admin")){

    echo "Tecnis repair, all of them";
}
    ?>



19: ok, parece que funciona con if (isset ($_POST['usuario']) and !($_POST['usuario']=="admin")){
¿Qué entendería VSCode con la anterior expresión??? Bueno, da igual ya

20: cuidado, está eso de que no entran dos $_POST en el mismo archivo, y lo de mandarlo por un input hidden... pero necesito las variables dentro del mismo archivo para poder operar con ellas... Aquí lo suyo sería tener una bdd y poder separar pantalla admin y pantalla tecnis, y que tuvieran en la bdd sus tareas...

ESTADO ACTUAL:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Reparaciones</title>
</head>

<body>

    <form action="index.php" method="post">

        <select name="usuario">
            <option value="admin">Administrativa</option>
            <option value="tecni1" selected>Técnico 1</option>
            <option value="tecni2">Técnico 2</option>
            <option value="tecni3">Técnico 3</option>
            <option value="tecni4">Técnico 4</option>
        </select>
        <input type="submit" value="Enviar">
    </form>

    <?php

    /* 
Debe crear una aplicación que gestione las tareas que deben realizar los trabajadores de
una empresa.
La aplicación debe tener dos tipos de usuari@s... trabajadores y administrador.
Por poner un ejemplo, imaginemos que tenemos una empresa de reparación de
electrodomésticos..., la empresa tiene en plantilla 4 técnic@s y una administrativa que se
encargar entre otras cosas de distribuir la carga
de trabajo entre los operarios, ella recibe
las llamadas y va completando la agenda de cada operario, les va asignado el trabajo a
realizar día a día y en qué momentos del día deben ir..., los operarios al entrar en la app
pueden revisar sus tareas, día, hora, lugar y descripción del problemas... una vez que han
ido el operario si puede dejar constancia de sus operaciones, si se ha terminado y tiene
que volver, etc,
 */

    /* ¿Y la contraseña de cada mochuelo?, ¿y la bdd común a mis mochuelos tecnis?? */

    $contadortareas = 0;
    $tarea = [];

    if (isset($_POST['usuario']) and ($_POST['usuario'] == "admin")) {

        echo "<br>Admin commands, I have the absolute control<br>";
    ?>

        <!--     sus tareas, día, hora, lugar y descripción del problemas -->
        <form action="index.php" method="post">
            <input type="number" name="dni" id="dnu" max=99999999 step=1 placeholder="DNI sin letra">
            <input type="submit" value="Enviar">
        </form>


    <?php
    }


    if (isset($_POST['usuario']) and !($_POST['usuario'] == "admin")) {

        echo "Tecnis repair, all of them";
    }
    ?>


</body>

</html>



¿puede haber un select en html sin form?

Sí, puede haber un <select> en HTML sin estar dentro de un <form>, pero perderá su funcionalidad principal de envío de datos; se usa para interactuar con JavaScript o para mostrar opciones seleccionables visualmente (con CSS), no para enviar información al servidor automáticamente como un formulario. Se requiere un <form> para la recolección y envío automático de datos, pero un <select> por sí solo es un elemento HTML válido para crear listas desplegables. 
Cuándo usar un <select> sin <form>:
Interacción con JavaScript: Para que JS controle qué se selecciona y realice acciones dinámicas (como cambiar otros elementos de la página o cargar contenido).
Selectores de estilo (experimental): Con HTML y CSS nuevos, se pueden estilizar selectores personalizados, aunque con soporte limitado aún, sin JS.
Elementos independientes: Si el <select> es parte de una interfaz más compleja donde no se requiere el envío de formulario, sino solo interacción del usuario. 
Ejemplo de <select> sin <form>:
html
<label for="color">Elige un color:</label>
<select id="color" name="color">
  <option value="rojo">Rojo</option>
  <option value="azul">Azul</option>
  <option value="verde">Verde</option>
</select>
<p>Has seleccionado: <span id="resultado">Ninguno</span></p>

<script>
  document.getElementById('color').addEventListener('change', function() {
    document.getElementById('resultado').textContent = this.value;
  });
</script>
En este caso, la selección se maneja con JavaScript, no se envía a un servidor. 
Cuándo SÍ se necesita un <form>:
Para enviar datos a un servidor (mediante el atributo action y un input type="submit"), es fundamental usar un <form> para agrupar los controles y gestionar el envío. 


Éxito: 25 me lleva a 26... pero REV, repasar lo del input hidden

Terminales de escritorio y terminales de consola (Ctrl+F5 creo que era para sacar una terminal de consola)

PASANDO DE ESTO DE AQUÍ:

Para asignar una posición de un array a una variable, usas el nombre del array seguido de corchetes [] con el índice (número de posición, empezando desde 0) y el signo de igual = para darle un valor, por ejemplo: miVariable = miArray[indice]; o miArray[indice] = valor; para cambiar un elemento existente. 
Para obtener el valor de una posición:
// En un array llamado 'frutas'
string frutas[] = {"manzana", "banana", "cereza"};
// Variable para guardar el valor de la segunda fruta
string segundaFruta = frutas[1]; // segundaFruta ahora es "banana"
Para asignar (modificar) un valor en una posición:
// En un array llamado 'numeros'
int numeros[] = {10, 20, 30};
// Asignar el valor 25 a la segunda posición (índice 1)
numeros[1] = 25; // numeros ahora es {10, 25, 30}
Puntos clave:
Índice: Los arrays empiezan en el índice 0 (la primera posición es [0], la segunda es [1], etc.).
Límites: No intentes acceder a una posición que no existe (por ejemplo, numeros[3] si solo tiene 3 elementos), ya que causará un error (ArrayIndexOutOfBoundsException). 
Ejemplo completo (JavaScript/Java):
javascript
let colores = ["rojo", "verde", "azul"]; // Array de strings
let primerColor = colores[0]; // Asigna "rojo" a primerColor
console.log(primerColor); // Muestra "rojo"

colores[2] = "amarillo"; // Cambia el tercer elemento (índice 2)
console.log(colores); // Muestra ["rojo", "verde", "amarillo"]
Este método funciona en la mayoría de los lenguajes de programación (C++, Java, JavaScript, Python, etc.) para manejar elementos individuales dentro de una colección de datos. 


ESTO MOLA MÁS:

Para asignar una posición de un array a una variable en PHP, usas $variable = $nombre_del_array[indice];, donde $indice es el número o clave de la posición que quieres extraer, como $nombre_del_array[0] para el primer elemento; esto copia el valor de esa posición a la nueva variable, permitiendo manipularlo independientemente, como muestra el manual oficial de PHP. 
Ejemplo con array indexado (numérico)
php
<?php
$frutas = array("manzana", "banana", "cereza");

// Asignar el primer elemento (índice 0) a una variable
$primeraFruta = $frutas[0];

echo $primeraFruta; // Muestra: manzana
echo "\n";

// También puedes modificarlo desde la variable
$primeraFruta = "uva";
echo $primeraFruta; // Muestra: uva
echo "\n";

// El array original no cambia (a menos que modifiques el array directamente)
print_r($frutas);
/*
Array
(
    [0] => manzana
    [1] => banana
    [2] => cereza
)
*/
?>
Ejemplo con array asociativo (clave-valor)
php
<?php
$usuario = array("nombre" => "Ana", "edad" => 30, "ciudad" => "Madrid");

// Asignar el valor asociado a la clave 'nombre'
$nombreUsuario = $usuario['nombre'];

echo $nombreUsuario; // Muestra: Ana
echo "\n";

// Modificar el valor usando la clave
$usuario['edad'] = 31;
echo $usuario['edad']; // Muestra: 31
?>
Puntos clave
Acceso por índice o clave: Usa corchetes [] con el índice (ej. 0, 1) para arrays numéricos o la clave (ej. 'nombre') para arrays asociativos, según lo explicado en este tutorial de Didesweb.
Copia de valor: La asignación crea una copia del valor. Si cambias la variable, el array original no se modifica, y viceversa, como se describe en YouTube.
Variables por referencia (avanzado): Si necesitas que la variable y el array apunten al mismo dato, usa & (ej., $primeraFruta = &$frutas[0];), pero normalmente no es necesario.


ESTADO A LAS 13:50:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Reparaciones</title>
</head>

<body>

    <form action="index.php" method="post">

        <select name="usuario">
            <option value="admin">Administrativa</option>
            <option value="tecni1" selected>Técnico 1</option>
            <option value="tecni2">Técnico 2</option>
            <option value="tecni3">Técnico 3</option>
            <option value="tecni4">Técnico 4</option>
        </select>
        <input type="submit" value="Enviar">
    </form>

    <?php

    /* 
Debe crear una aplicación que gestione las tareas que deben realizar los trabajadores de
una empresa.
La aplicación debe tener dos tipos de usuari@s... trabajadores y administrador.
Por poner un ejemplo, imaginemos que tenemos una empresa de reparación de
electrodomésticos..., la empresa tiene en plantilla 4 técnic@s y una administrativa que se
encargar entre otras cosas de distribuir la carga
de trabajo entre los operarios, ella recibe
las llamadas y va completando la agenda de cada operario, les va asignado el trabajo a
realizar día a día y en qué momentos del día deben ir..., los operarios al entrar en la app
pueden revisar sus tareas, día, hora, lugar y descripción del problemas... una vez que han
ido el operario si puede dejar constancia de sus operaciones, si se ha terminado y tiene
que volver, etc,
 */

    /* ¿Y la contraseña de cada mochuelo?, ¿y la bdd común a mis mochuelos tecnis?? */

    if (isset($_POST['usuario'])) {
        $usuario = $_POST['usuario'];
        $contadortareas = 0;
        $tarea = [];
    }

    if (isset($usuario) and ($usuario == "admin")) {

        echo "<br>Admin commands, I have the absolute control<br>";
    ?>

        <!--     sus tareas (técnico), día, hora, lugar y descripción del problemas -->
        <form action="index.php" method="post">
            <input type="number" name="tecni" min=1 max=4 step=1 placeholder="Técnico encargado 1 a 4" required>
            <input type="date" name="fecha" placeholder="Fecha del encargo" required>
            <input type="time" name="hora" placeholder="Hora del encargo" required>
            <input type="text" name="lugar" placeholder="Dirección del cliente" required>
            <input type="text" name="problema" placeholder="Descripción del problema" required>
            <input type="submit" value="Enviar">
        </form>
        <!-- Quedaría poder consultar con lo que tiene cada técnico y que nos sacara como candidato el que menos tareas tiene asignadas -->

    <?php
        $tarea[$contadortareas] = ["tecni" . $_POST['tecni'], $_POST['fecha'], $_POST['hora'], $_POST['lugar'], $_POST['problema'], ""];
        $contadortareas++;
    }


    if (isset($usuario) and !($usuario == "admin")) {

        echo "<br>Tecnis repair, all of them<br>";

        /* 
           los operarios al entrar en la app verán sus tareas, día, hora, lugar y descripción del problemas
        */

        while ($a <= $contadortareas) {
            $tec = "tecni" . $tarea[$contadortareas][0];
            if ($tec == $usuario) {
                $elegido = $a;  /* Para luego mostrar este $elegido */
                $a = $contadortareas * 2;
            }
            $contadortareas++;
        }

        echo "<pre>";
        print_r($tarea[$elegido]);
        echo "</pre>";

    ?>

        <form action="index.php" method="post">
            <input type="text" name="observac" placeholder="Observaciones del técnico" required>
            <input type="submit" value="Enviar">
        </form>

    <?php
    
        $tarea[$elegido][5] = $_POST['observac'];
    }
    ?>


</body>

</html>


46 me lleva a un bucle infinito por 47... Ok, no es $contadortareas++; sino $a++;

Una vez corregido eso (49) llego a 48, ya más lógico

REV, ¿un textarea dentro del form? Probemos... 55 lleva a 54.
Quedaría quitar los warnings y probar el funcionamiento general
Ya, y ponerle contraseñas, y al tenerlo todo en bdd que admin y tecnis sean páginas diferentes
Y un botón o circuito de salida para poder escapar sin salir a lo bruto

ESTADO DESPUÉS DE 55:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Reparaciones</title>
</head>

<body>

    <form action="index.php" method="post">

        <select name="usuario">
            <option value="admin">Administrativa</option>
            <option value="tecni1" selected>Técnico 1</option>
            <option value="tecni2">Técnico 2</option>
            <option value="tecni3">Técnico 3</option>
            <option value="tecni4">Técnico 4</option>
        </select>
        <input type="submit" value="Enviar">
    </form>

    <?php

    /* 
Debe crear una aplicación que gestione las tareas que deben realizar los trabajadores de
una empresa.
La aplicación debe tener dos tipos de usuari@s... trabajadores y administrador.
Por poner un ejemplo, imaginemos que tenemos una empresa de reparación de
electrodomésticos..., la empresa tiene en plantilla 4 técnic@s y una administrativa que se
encargar entre otras cosas de distribuir la carga
de trabajo entre los operarios, ella recibe
las llamadas y va completando la agenda de cada operario, les va asignado el trabajo a
realizar día a día y en qué momentos del día deben ir..., los operarios al entrar en la app
pueden revisar sus tareas, día, hora, lugar y descripción del problemas... una vez que han
ido el operario si puede dejar constancia de sus operaciones, si se ha terminado y tiene
que volver, etc,
 */

    /* ¿Y la contraseña de cada mochuelo?, ¿y la bdd común a mis mochuelos tecnis?? */

    if (isset($_POST['usuario'])) {
        $usuario = $_POST['usuario'];
        $contadortareas = 0;
        $tarea = [];
    }

    if (isset($usuario) and ($usuario == "admin")) {

        echo "<br>Admin commands, I have the absolute control<br>";
    ?>

        <!--     sus tareas (técnico), día, hora, lugar y descripción del problemas -->
        <form action="index.php" method="post">
            <input type="number" name="tecni" min=1 max=4 step=1 placeholder="Técnico encargado 1 a 4" required>
            <input type="date" name="fecha" placeholder="Fecha del encargo" required>
            <input type="time" name="hora" placeholder="Hora del encargo" required>
            <input type="text" name="lugar" placeholder="Dirección del cliente" required>
            <input type="text" name="problema" placeholder="Descripción del problema" required>
            <input type="submit" value="Enviar">
        </form>
        <!-- Quedaría poder consultar con lo que tiene cada técnico y que nos sacara como candidato el que menos tareas tiene asignadas -->

    <?php
        $tarea[$contadortareas] = ["tecni" . $_POST['tecni'], $_POST['fecha'], $_POST['hora'], $_POST['lugar'], $_POST['problema'], ""];
        $contadortareas++;
    }


    if (isset($usuario) and !($usuario == "admin")) {

        echo "<br>Tecnis repair, all of them<br>";

        /* 
           los operarios al entrar en la app verán sus tareas, día, hora, lugar y descripción del problemas
        */

        while ($a <= $contadortareas) {
            $tec = "tecni" . $tarea[$contadortareas][0];
            if ($tec == $usuario) {
                $elegido = $a;  /* Para luego mostrar este $elegido */
                $a = $contadortareas * 2;
            }
            $a++;
        }

        echo "<pre>";
        print_r($tarea[$elegido]);
        echo "</pre>";

    ?>

        <form action="index.php" method="post">
            <!-- <input type="text" name="observac" placeholder="Observaciones del técnico" required> -->
            <textarea name="observac" rows="10" cols="50" maxlength="300">Observaciones del técnico</textarea>
            <input type="submit" value="Enviar">
        </form>

    <?php

        $tarea[$elegido][5] = $_POST['observac'];
    }
    ?>


</body>

</html>


WARNINGS ADMIN:


Warning: Undefined array key "tecni" in /home/arturo/public_html/examenes/2/index.php on line 66

Warning: Undefined array key "fecha" in /home/arturo/public_html/examenes/2/index.php on line 66

Warning: Undefined array key "hora" in /home/arturo/public_html/examenes/2/index.php on line 66

Warning: Undefined array key "lugar" in /home/arturo/public_html/examenes/2/index.php on line 66

Warning: Undefined array key "problema" in /home/arturo/public_html/examenes/2/index.php on line 66


REV, estos entiendo que se van con un isset del $_POST


WARNINGS TÉCNICO:

Warning: Undefined variable $a in /home/arturo/public_html/examenes/2/index.php on line 79

Warning: Undefined array key 0 in /home/arturo/public_html/examenes/2/index.php on line 80

Warning: Trying to access array offset on value of type null in /home/arturo/public_html/examenes/2/index.php on line 80

Warning: Undefined variable $a in /home/arturo/public_html/examenes/2/index.php on line 85


Warning:  Undefined variable $elegido in /home/arturo/public_html/examenes/2/index.php on line 89



Warning:  Undefined array key "" in /home/arturo/public_html/examenes/2/index.php on line 89

Observaciones del técnico
 

Warning: Undefined array key "observac" in /home/arturo/public_html/examenes/2/index.php on line 102

Warning: Undefined variable $elegido in /home/arturo/public_html/examenes/2/index.php on line 102



REV: lo de 79, 85 y 89 es inicializar $a y $elegido... pero cuidado con los warnings de array, esos me hacen dudar si estoy expresando bien el array, hay que revisar sus dimensiones (1-2) y si las tramito adecuadamente, tal vez me haya extralimitado con eso basado en el string
... ambos de 89 creo que será tema de inicializar
... y los de 102 serán isset e inicialización, respectivamente

Y espero haber inicializado bien el array en 46


Ver los log: o entrando por terminal de Debian con ssh o en el servidor de Virtualmin


*** Día 14/01/2026

EXAMEN 2:
Plantear la estructura:
Pantalla de acceso
Repositorio de usuarios

Desde el acceso vamos a ventana de admin o de técnicos

Tareas del admin:
Añadir/eliminar operarios
Repartir tareas
Cuidar de no asignar tareas incompatibles a un mismo usuario

Es decir, te hace falta un repositorio de tareas. Lo ideal sería usar bdd, pero en este caso era por array o json

(OBS)

Caso de varios CSS en una página: uno para PC, otro para móvil, otro para tablet, otro que necesite una librería de JS...

30: colorhunt.co
50: si copias y pegas la URL te redirecciona a error1
57 y 58 fontawesome para los iconos
63: la primera vez que se entra no hay error

70 entrando con el admin serafina
77: mal, nos deja entrar sólo con la URL

Si queremos que Serafina entre sin necesidad de la clave podemos recurrir a una cookie en el equipo de Serafina (la estuctura cambia a la de la foto del móvil, 10:48 aprox)
... 82: usamos setcookie
83: en la vida real le pondríamos un nombre raro para que nadie lo pueda identificar con el contenido
84 es la fecha en formato UNIX, segundos desde 01/01/1970, la fecha UNIX
85 indica caducidad de 1 año

94: exit corta la ejecución

96: al cargar la web en ese equipo ya pasa directamente al admin.php

101: https://javier.avisando.com/php/examen2/index.php?error=3

105: Se mete el include en las páginas que gestiona el admin
124: ya ambas zonas están limitadas a la admin Serafina

144, 145: al poner true lo convierte en un array

$operarios será un array bidimensional. Es un array de usuarios, y cada usuario es un array (con nombre, usuario y password)

147: se guarda convertido en array
150: al download file vemos el contenido

jqueryui.com

169: la función se autoejecuta cuando la página se renderiza por completo

La línea inferior de 176 la ha cogido de 175

Los CSS se leen de arriba a abajo, el inferior tendrá más poder

177: añades a un usuario y ya aparece en el acordeón

178: cambiamos a otra versión del acordeón y llegamos a 179

186 lleva a 185
228 es al pinchar en API Documentation, lo hacemos para buscar cómo ampliar el tamaño

Cambia algo en la línea de código (la 82) y 235

¿Falta algo antes de 259 en el js?

269: corrige en esa línea y ya 270 al actualizar. Download y 271

281: cambiando esto no machacamos el bucle superior

Si cerramos sesión borraríamos la cookie, y redirige a la index

PROPUESTA:
Aplicación para añadir un producto
Luego una select de tiendas disponibles
Concluir en una lista de la compra, agrupando por tiendas qué cogemos de cada tienda
Y abajo que puedas tachar/recuperar el producto o borrarlo (para hacer que desaparezca)


*** Día 15/01/2026

La semana que viene M y X presencial, el resto AV

De Carmen:
Curso PRL de 30 horas, al final importante descargar el diploma correspondiente (si no PRL no prácticas)
CV en formato europeo, necesita el número propio de SSocial (no de beneficiario)... Ver nóminas
Comentar si tenemos problemas de prácticas a 8 horas y necesitamos reducciones, hasta max 4 horas... comentar disponibilidad

21: es la caducidad del enlace público

https://europa.eu/europass/eportfolio/api/eprofile/shared-profile/alfonso+javier-gil+llamas/c7a5999d-50fc-441b-adce-168fb853528b?view=html

Consultar si Linkedin saca el Europass

44 tras Administrar aplicaciones web en Virtualmin

50: el password se guarda encriptado en formato binario

En bbdd relacionales hay que evitar la redundancia. Cuando encontremos redundancias es el momento de llevar información a tablas aparte, que ya relacionaremos
SQL nos permite trabajar con la bdd, gestionarla

Una variable text ocupa más en disco que una varchar porque reserva en disco todo el espacio pongas lo que pongas. Eso quiere decir que en text todos los registros ocupan lo mismo, pero que tendrás espacios vacíos.
En text se gana rapidez en procesos, porque va saltando entre espacios iguales (Política de punteros en memoria). En cambio en varchar no puede calcular automáticamente para ir a un registro, porque tiene que ir de uno en uno.

Las direcciones de memoria van en hexadecimal (base 16)

Text para lo que se vaya a buscar más, varchar para lo que menos

Búsquedas sobre entero es lo más rápido, y si son índices más

81 y 82: se agranda la casilla arrastrando desde la esquina inferior derecha, como en Intera
83 pedía tamaño para los varchar
85, 87: creamos la relación

88: en cascada es que al borrar un cliente se cargaría sus incidencias

89, restrict: no puedes borrar trabajadores mientras tenga incidencias abiertas, por ejemplo
... para resolver el tema de las incidencias antiguas mejor que borrar trabajadores cuando se vayan, ponerle un campo de si sigue trabajando allí o no

94, 95: para el deslogado hay que borrar la cookie

112 significa que nos hemos conectado

$mysqli es un objeto

116: en query llevaremos la sentencia SQL, en este caso nos daría como resultado Serafina

128: si no ponemos explicaciones de error concretas dificultamos los ataques externos, por ejemplo con Hydra lanzando peticiones de contraseñas diferentes en un ataque de fuerza bruta

131: ahí comenta el filtro superior y ya puede acceder como admin

138: eliminamos en local y servidor

153: el 4 ya no se repite, la id es única para evitar problemas de relaciones

179, 180, 182: adaptamos el código a su uso con bdd

186: no había indicado al cliente


*** Día 16/01/2026

10:50,, de protoboard a placa base (Es cuando llego)

11: https://www.youtube.com/watch?v=r3i-gnVmBxE&t=885s (Lo encuentro en pantalla, pero no sé por qué)

18: ha añadido dos clases, y prima la última

23: sólo queríamos a los técnicos

Ajax: en vez de hacer una petición al servidor se hace a la trastienda

39: la respuesta es la carga útil de vuelta


El operador like es para buscar cosas similares a algo, patrones

dni like '%$texto%'


Hasta 90: va adaptando la consulta original
92: al quitarle el name no se envía

95... no imprimió el hola... era que estaba en otro fichero

En 108 han desaparecido esas incidencias, aunque siguen existiendo en la bdd

118: ha usado el fichero de incidencias para hacer esto para los clientes

119: a nivel profesional esto es mejorable

Otros temas:
Incidencias anuladas vs borradas
Edición de incidencias por la admin
Envío de notificaciones al móvil desde la aplicación
Que la admin pueda enviar mensajes a los operarios


Ref comunicaciones:
Mail: gratis, pero van a spam
SMS: los vemos pero pueden estar sujetos a tarifas
Notificaciones: a día de hoy no funcionan muy bien
Redes sociales: no aconsejable, no se llega bien al público objetivo. Y dependes de otro, no de ti.

Whatsapp no tiene API, así que no se pueden automatizar envíos masivos. Y los mensajes de difusión y grupos están limitados. Y para ver los mensajes de las comunidades tienes que entrar en ellas, no saltan alertas


*** Día 19/01/2026

De lo de hoy no tengo pantallazos


*** Día 20/01/2026

Perplexity, la IA de Movistar cliente premium
La IA china es Deep Seek, integramente gratuita
10 y siguientes: Codecanyon, web de pago con aplicaciones y plugins ya hechos

Núm SSocial y CV Europass ráspido, luego PRL. PRL sí valdría para otros cursos que nos lo pidan, excepto si es algo más sofisticado que requiera un curso PRL más avanzado

23: js table, es bueno para hacer tablas dinámicas
29: te permite ordenar y buscar fácilmente

38: nuestros estilos y script siempre al final, posterior a las librerías y demás

40: en php se pondría -> en vez del . de JS
Pasa de 43 a 42 porque reordena

48, 49 es la estructura de un json

56: sigue fallando la ordenación
57, 58: lo hace por programación orientada a objetos (lo ha visto en los ejemplos de ordenación/order)

64: esta forma es peor porque el script sólo se ejecuta cuando el document está ready, entonces la ocultación no funciona porque la tabla todavía no está hecha

68: comienza por el último cliente, por el más reciente

En estas librerías hay que buscar las soluciones en el manual

70 para cambio de idioma

... la línea 33 es la que provoca el conflicto, parece ser

88: copia el formulario de altas de clientes como base para el de edición

103: otro reaprovechamiento de código

108: no lo está renderizando bien

109: faltaba ese CSS en clientes.php

117, 118: lo coge con formato de json (en forma de pares de valores), que en JS también podemos tratar como un array

125: comparativa de ficheros por la línea de tiempo

133 y anteriores: pregunta al servidor, que devuelve un json. Y luego muestra ese json

Tras mostrarse el error con el echo, en 146 vemos que falta el id... y corregimos, faltaba ese parámetro


EJERCICIO:
En el header un listado de productos

Luego tiendas por debajo. Y el botón de añadir

En la segunda mitad agrupar los productos por tienda, que tengan un icono de borrar

(Lo único que añadimos o borramos son los productos, las tiendas son fijas)


En una aplicación lo primero es la bbdd

EJERCICIO 2:
Un micro al lado de los productos para que lo coja por voz. Es una función nativa de JS



https://arturo.avisando.com/bbdd/index.php?route=/server/databases
arturo@123456


*** Día 21/01/2026

28 a 30: Cómo relacionar tablas después de crearlas
32, 33: Cómo renombrar tablas creadas

35: tras pinchar en Conexiones llego a https://www.php.net/manual/es/mysqli.quickstart.connections.php

48: no marcamos DNS porque usamos el servidor DNS de clouding

En el ejercicio de la tienda entiendo que al final debería haber un drop de la tabla de productos... también podemos aprovechar esto para evitar crear un campo de unidades, y endosárselas a la descripción del producto


fetch_assoc() en PHP recupera una fila de un conjunto de resultados de base de datos como un array asociativo, donde las claves son los nombres de las columnas y los valores son los datos de esa fila, avanzando el puntero interno para la siguiente llamada, y devuelve NULL si no hay más filas, siendo ideal para leer datos fila por fila de forma legible y eficiente. 
¿Cómo funciona?
Ejecutas una consulta SQL (SELECT * FROM usuarios).
Obtienes un resultado (un objeto mysqli_result o PDOStatement).
Llamas a fetch_assoc() repetidamente (normalmente dentro de un bucle while).
Cada llamada trae una fila y la transforma en un array asociativo (ej: ['id' => 1, 'nombre' => 'Ana']).
El puntero avanza a la siguiente fila.
Cuando no hay más filas, devuelve NULL, terminando el bucle. 
php
// Ejemplo con MySQLi
$conn = new mysqli("localhost", "usuario", "contraseña", "basededatos");
$resultado = $conn->query("SELECT id, nombre FROM usuarios");

if ($resultado->num_rows > 0) {
    // Bucle para recorrer cada fila
    while($fila = $resultado->fetch_assoc()) {
        echo "ID: " . $fila["id"] . " - Nombre: " . $fila["nombre"] . "<br>";
    }
} else {
    echo "No hay resultados";
}
$conn->close();


58, 59: la instrucción     $mysqli->query("INSERT INTO `licomar_productos` (`idproducto`, `nomproducto`) VALUES ('lo que sea + 1', {$_POST['produclis']}");  recoge el INSERT INTO de añadir en la bdd algo y copiar la instrucción, y de 57 el meter el $_POST entre llaves. Algo es algo para empezar


Variables de sesión: son las que almacenan información durante el tiempo que dura la sesión, entendiendo sesión como el tiempo X que está abierta la página. Unz vez que se cierra esa sesión, la información desaparece.
(La sesión es el tiempo que está abierta la página de un banco, por ejemplo)


ESTADO A LAS 14:48:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Licomar</title>
</head>

<body>


    <?php

    $mysqli = new mysqli("localhost", "arturo", "arturo@123456", "arturo");

    // echo $mysqli->host_info . "\n";

    $contador = 0;

    ?>

    <form action="index.php" method="post">
        <input type="text" name="produclis" placeholder="Añade un producto" maxlength="50" required>

        <?php
        $tiendaslis = $mysqli->query("SELECT * FROM `licomar_tiendas`");

        ?>

        <br><br>
        <select name="tiendaart">

            <?php while ($fila = $tiendaslis->fetch_assoc()) { ?>

                <option value="<?php echo $fila["idtienda"]; ?>"> <?php echo $fila["nomtienda"]; ?> </option>

            <?php } ?>

        </select>

        <input type="submit" value="Enviar">

    </form>



    <?php

    if (isset($_POST['produclis'])) {

        $contador++;

        $mysqli->query("INSERT INTO `licomar_productos` (`idproducto`, `nomproducto`) VALUES ({$contador}, {$_POST['produclis']}");

        $mysqli->query("INSERT INTO `licomar_articulos` (`idarticulo`, `idproducto`, `idtienda`) VALUES ({$contador}, {$contador},{$_POST['tiendaart']} );");
    }

    ?>

    <a href="lista.php"> Formalizar lista </a>

</body>

</html>


Y EL LISTA.PHP:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Licomar</title>
</head>

<body>

    <?php
    $mysqli = new mysqli("localhost", "arturo", "arturo@123456", "arturo");




    ?>

    <a href="index.php"> Generar una nueva lista </a>

</body>

</html>


Me quedaría un for hasta el total de tiendas
con un if tienda tiene contenido o está dentro de articulos
que ponga el nombre de la tienda
que me haga un select de tal, tal, tal de las tablas con un group by idtienda
y al acabar drop de tablas excepto de tiendas


*** Día 22/01/2026

Jose preguntó en el tutorial de MySQL para hacer su programa, mejor que en chat GPT
Puedes capturar la IP de los visitantes por PHP, y saber así desde qué país acceden

69 con operarios.php y 70 con guardaroperario.php. Parece que desde el código fuente esto se comporta como un ser vivo, que reacciona también desde aquí a mis intentos de arrebatarle sus secretos, el código


*** Día 23/01/2026

8: es bueno marcar unsigned para que, siendo todos los valores positivos, puedas tener el doble de valores, porque en vez de ignorar los negativos esos se pasan a positivos

13 es para que no den problemas los caracteres especiales, es el rango idiomático

14: el más habitual es InnoDB, MyISAM no permite transacciones pero es muy rápida
InnoDB le parece más preferible, sólo permite transacciones con los elementos existentes, además te deja borrar sólo los elementos que no tienen registros asociados. De esta forma puedes tener aplicaciones más robustas y seguras, son más eficientes en inserciones y actualizaciones, aunque las MyISAM funcionan mejor en búsquedas, son las mejores en búsquedas, porque tienen una mejor estructura técnica, por ejemplo porque no usan claves foráneas

20 y 21: desde Administrar aplicaciones web les añade el phpmyadmin

26, 27: lo hace tras dar en "Edit inline"

30: AI significa autoincrementable

32: con change podemos cambiar la estructura en cualquier momento

Hay que pensar el tipo desde el principio porque los tipos de las variables que relacionemos con ellas deben estar sincronizados... lo hace así en 43, y en 46, 47 se marca la relación

38, 39: valores por defecto, y sus comentarios. La ventana de comentarios se amplía pinchando en la esquina inferior derecha, como las de Intera

41, 42: un index es un campo crítico para hacer filtros o búsquedas, las búsquedas sobre los index son más rápidas. Es mejor que los index sean numéricos, mejor que strings

48: restrict para no poder eliminar establecimientos que tengan productos asignados, en cascada para que los borre en el proceso (49)
En 50 está la instrucción

MyISAM no permite claves foráneas (es decir, de otra tabla)

52: al poner el ratón encima se ven los comentarios

56: error que sale al intentar poner un valor que no existe en la otra tabla

57: podemos añadir plugins de MySQL en VSCode para que nos autocomplete, ver las tablas desde VSCode...

69: abre el puerto que le decía VSCode al instalar el pluguin

Con 82 ya le deja

90, 91... al final prefiere instalar otro

100: aquí no aparece el puerto 3306, lo agrega

106: recarga el cortafuegos pero sigue sin conectar

109: puerto 22 abierto, así que elimina el 3306 de la lista, lo cierra en 112

116: ya ve bien Javier y reinicia, lo intentará por SSH, conectando de forma remota como si fuera local

En Home estábamos todos nosotros

122, 123: lo ha conseguido por un túnel, conectando por túnel con el equipo y luego ya con la bdd, en vez de directamente con la bdd
124, 125: y puede trabajar con la bdd desde VSCode, aunque él va por phpmyadmin

Copia la conexión desde el otro archivo

137: tras open query a la derecha de listacompra_productos de la columna izquierda

144: el data_seek es para volver al inicio de la tabla, y recorrerlos de nuevo con el fetch_assoc

149: no todos los productos, filtra con el where

154 para insertar registro
161: quita las comillas

Hasta 171: Tras poner el location ya funciona

201: y no se sobrecarga con librerías, es sólo copiar y pegar el símbolo

230, 231: el gap sigue dando problemas

273: editando, con el botón derecho

292: ya sale el nuevo icono y ya tacha y destacha

310: no aplica el rosa porque le da más importancia a lo marcado

318: esto sería para mover artículos de una tienda a otra. No funciona en móviles

324: para que demore un poco de tiempo en el proceso, para que dé un pequeño retardo


*** Día 26/01/2026


Para él es mejor cambiar la DNS a la de clouding, porque si no el acceso a la web puede tardar bastante


*** Día 27/01/2026

PUNTO DE PARTIDA:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Licomar</title>
</head>

<body>


    <?php

    $mysqli = new mysqli("localhost", "arturo", "arturo@123456", "arturo");

    // echo $mysqli->host_info . "\n";

    $contador = 0;

    ?>

    <form action="index.php" method="post">
        <input type="text" name="produclis" placeholder="Añade un producto" maxlength="50" required>

        <?php
        $tiendaslis = $mysqli->query("SELECT * FROM `licomar_tiendas`");

        ?>

        <br><br>
        <select name="tiendaart">

            <?php while ($fila = $tiendaslis->fetch_assoc()) { ?>

                <option value="<?php echo $fila["idtienda"]; ?>"> <?php echo $fila["nomtienda"]; ?> </option>

            <?php } ?>

        </select>

        <input type="submit" value="Enviar">

    </form>



    <?php

    if (isset($_POST['produclis'])) {

        $contador++;

        $mysqli->query("INSERT INTO `licomar_productos` (`idproducto`, `nomproducto`) VALUES ({$contador}, {$_POST['produclis']}");

        $mysqli->query("INSERT INTO `licomar_articulos` (`idarticulo`, `idproducto`, `idtienda`) VALUES ({$contador}, {$contador},{$_POST['tiendaart']} );");
    }

    ?>

    <a href="lista.php"> Formalizar lista </a>

</body>

</html>

Y EL LISTA.PHP:
<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Licomar</title>
</head>

<body>

    <?php
    $mysqli = new mysqli("localhost", "arturo", "arturo@123456", "arturo");




    ?>

    <a href="index.php"> Generar una nueva lista </a>

</body>

</html>




Me quedan las relaciones en la bbdd
Me quedaría un for hasta el total de tiendas
con un if tienda tiene contenido o está dentro de articulos
que ponga el nombre de la tienda
que me haga un select de tal, tal, tal de las tablas con un group by idtienda
y al acabar drop de tablas excepto de tiendas


Que cada usuario tenga su propia lista de la compra, con los productos ordenados por establecimiento
Cada usuario podrá ver sólo sus productos y sus establecimientos
Que no tengas que logarte a no ser que cierres la sesión... Es decir, una cookie
... el index será el de login
Que la gestión de usuarios sea desatendida, que se den de alta ellos mismos
Le pediremos nombre, usuario, password, mail
Para evitar que nos entren bots podemos recurrir a captchas, mails de confirmación (PHP los puede enviar con la librería phpmailer(10))
Por número de teléfono no porque el SMS te cuesta dinero

11: https://mailtrap.io/es/blog/phpmailer/

Hasta 14: C:\ProgramData\Microsoft\Windows\Start Menu\Programs. En Windows 10

22: es la bdd la que controlará que sea único

28: da error porque al añadir el campo usuario se ha completado con 0's y no hay usuario 0

No deja truncate porque hay relaciones, porque hay productos... lo pasa a cascada

35: es más aconsejable añadir el campo de usuario porque si la aplicación crece tal vez podamos necesitarlo

En el dominio tienen que estar las palabras clave de lo que sea, para que los buscadores nos indexen bien
"la lista de la compra" es lo que mejor lo define

Los dominios .com están ya muy cogidos. También son más inmediatos al darlos de alta

55: no añade servicios adicionales

Tras el pago, aparece en azul mientras se gestiona el alta y se pone en verde (56, 57)

66: alfonso, alfonsoDELACOMPRA69

88: ese index es el de "sitio web habilitado", lo borra y copia los archivos que ya tiene. Luego sincroniza.

99: cambia javier por lista para poder importar

No se lo cogía hasta que no pincha en lista antes de importar

109: home es copia de index... por ahora, para aprovechar cosas

115: ha añadido el margin de abajo y ese padding

El correo sólo puede recibir html, no formularios, así que tenemos que usar el método get, no el post
Pero como nos podrían dar altas por la url asociamos al get una clave que irá asociada a cada nuevo usuario. Esa clave también irá en la cookie para que no nos puedan hacer un robo de sesión y cambiarla.

145: para confirmar si es un mail

Hasta 154 es una inyección de sql. Para evitar eso se hace el real_escape_string de después

161: ponemos la barra para poder guardar la comilla, es lo que hace el real_escape_string con los caracteres especiales para evitar ataques como los de 163

165: se cambian los $_post por las variables ya procesadas

168: con consultas preparadas si el resultado no coincide con el esquema no se ejecuta nada

171, 172: se quitan los caracteres que se pueden prestar a confusión

175: ya tenemos un generador de claves aleatorio

194: interesan esos registros y el de abajo

TTL mejor no tocarlo

197 es un apunte para que estos correos sólo puedan salir desde aquí

199: DKIM es una especie de firma. Es igual de obligatorio que el anterior, que el spf1, para que no nos suplanten en el correo

201 es Evolution

Es un subdominio que sirve como servidor de envío y recepción

203: se enviaría desde el puerto 25

220: se instala desde la tienda


*** Día 28/01/2026

hash es una función para encriptar


phpmailer para enviar el correo

18: es importante renombrar la carpeta porque hay ataques en los que buscan carpetas por nombres
20: a estos ficheros no llegan porque se procesan del lado del servidor

require es lo mismo que include

26: un objeto es una variable que no guarda un valor, que guarda algo más: funciones, variables...

32: fuera attachments, no se envían adjuntos

43: faltaba el upload folder... luego cambia las comillas y las acaba quitando...

49: demasiado $mail, se cambia en 50 a $correo
Para cada nuevo intento actualiza, y luego tiene que borrar el nuevo usuario que tiene sin activar para hacer otro intento

67: el problema es que no le activa el certificado de seguridad


71: que mande el password sin certificado
73: borrar registros y poner ese campo a 0 para "reiniciar" el proceso

83: sigue entendiendo que está en inglés

87: limit 1 por si acaso

99: daba error por pinchar en el correo anterior, que tenía otra clave

106: creamos una cookie de 500 días
109: vemos la cookie que define la sesión

Copia tres líneas de código del otro archivo...
111: como nos pueden atacar modificando la cookie recurrimos de nuevo a consultas preparadas (114)

121: ya al añadir usuario y activarlo te mete en la aplicación
122: si no tienes cookie no te lleva a la home

128: lo de fetch_assoc() es un array
fetch_assoc() (de la extensión mysqli en PHP) toma una fila de resultados de una consulta SQL y la devuelve como un array asociativo, donde las llaves son los nombres de las columnas de la base de datos. Mueve el puntero interno al siguiente registro y devuelve null cuando no quedan más filas, siendo ideal para bucles while

140 a 142: sin cookie te manda al login

170: cambia de none a block al pinchar

inherit para que recoja la herencia

176, 177: formas de eliminar la cookie

181, 182: para que todo tenga el mismo estilo

184: lo interno que aparece no comentado es como si estuviera comentado en realidad

191, 192: ya tenemos los establecimientos por usuario


200,201: editar y go para rellenar muchas líneas

Luego si eliminas un artículo se recarga todo... para eviatr eso necesitas JS
Además el header no está fijo... 204
Conclusión: hay que ir revisando cosas

216: sortable no funciona en móvil, sólo con ratón... aunque hay un plugin que sí lo hace

220, 221: salen cerrados los dos porque no hay 10000 establecimientos... ese 9999 es el número de establecimiento que deja abierto

222: esa forma de verse me recuerda a una web que inspeccioné

224: pone un z-index muy elevado para que siempre quede por encima el header y no dé conflicto con el main

228: lo de abajo a la derecha es la línea del css donde están esas instrucciones, y vienen ordenadas según importancia


*** Día 29/01/2026

Readaptación del CSS por el accordion

Hasta 55: es porque tenía más jerarquía el CSS del accordion (se veía en Inspeccionar), y metemos un CSS para el accordion para que tenga en cuenta el colorrosa

Vamos a introducir los productos vía JS, no por post, para que no haya que recargar la página

74: aparecen los id del establecimiento

91: insert_id es para recoger el último id introducido

96: 200 es que ha ido bien, no es 400, 500

data es el id del producto

Sin embargo, al comprar o reactivar productos sigue recargando la web

O guardamos en los productos el usuario o lo de 126, mediante producto cartesiano


132: ese producto pertenece al usuario y lo podemos borrar

139: esa parte ya no se necesita
143: lo ha borrado, pero falta que se note el borrado.

147: JS tiene promesas (PHP, C, C++, Java... no), instrucciones que no paralizan el resto del programa. El resto se va ejecutando mientras se procesa esa promesa

2000 equivale a 2 segundos


167: se ejecuta el código malicioso
172: igual que aquí vemos la cookie se puede enviar a una bdd privada del atacante, para robos de sesión o de información

189: en vista previa volvemos a ver los errores
193, 194: le ha puesto las / para que entren las comillas y colar el código... si eliminamos el artículo se elimina el código

195: lo haremos mejor por sentencias preparadas

201 a 203: el script está, pero no funciona

213: ya no deja añadir el script

224: ya sólo permite strong's
230, 233: al recargar la página ya no saca la imagen

260: ahí no puedes incluir funciones

272: borraríamos el usuario si detectamos un número elevado de peticiones en poco tiempo

284: vemos en tablas que el usuario y sus productos y establecimientos han desaparecido


*** Día 30/01/2026

12: El error del correo era algo puntual, no es algo que hubiéramos hecho mal, porque en otro intento lo hace bien
16: estaría bien incluir en esa línea algo para reenviar el correo de activación

19: faltaría montar ese proceso
20: tras la activación del usuario entra

27: el error es porque ahí no recoge el usuario

29: comenta eso para actualizar la web y que se cree el usuario

30: el código tenía que ir ahí dentro, más abajo
34: tras la activación carga esas tiendas por defecto


Se podría añadir icono de cerrar sesión, dar la opción a ordenar las tiendas... etc
El orden sería añadiendo en la tabla de 39 un campo de orden
También se podría hacer que te ordene las tiendas según el número de productos, por ejemplo

43: el scroll crece según la tienda que más productos tiene... ya en 48 queda resuelto, incluso sin recargar tras añadir productos

52: comenzamos el tema de la voz... hasta 56 lanza voz() desde la consola, en 57 la instrucción en el código

61: id establecimiento se pone en negro porque ya se usa la variable

66 a 68: poniendo la función en el código se añade el producto automáticamente

Después intenta añadir el pulsate pero se ve el error en Inspeccionar

85: hace el efecto en todo y no puede ser... resuelto en 86, atacando al id concreto

87: hay que evitar también las recargas al ocultar y reactivar

118: no, hay que atacar al li

121: el ocultado no aparece como grid… resuelto en 126

137: como ya tenemos un icono de los Font awesome ya pasa todos los UTF 8 a esos fa

138, 139 para que quede cada línea mejor organizada

150, 151: por el gap de 4px

162: va con :: porque es una pseudo

174, 175: se cambia eso porque ya tenemos la cookie

176: hay que cuidar que ese producto sea de nuestro usuario

181, 182: para evitar renglones largos podemos cortar línea en el where

189, 190: bien, la consola no muestra errores

200: y en vista previa pone un 1

205, 206: acepta la propuesta del GitHub de VS Code

221: establecimientos es copia de home, pero hay que irle borrando cosas

226: hemos ido a establecimientos


*** Ver si hay tiempo perdido


267, 268: o escape o comillas simples

288: actualizar el js para ver si hace el efecto
289: no lo hace por estos errores
292: al quitar el display:none aparece
293, 294: es esa línea la que produce los errores

… era porque en establecimientos no tenemos la jQuery.ui

306: falla por las promesas: se ejecuta el añadido antes que la recogida de voz

312: lo hacía bien pero el texto era demasiado largo

313 a 317: ya resuelto, da el mensaje de error pero no produce error en la consola

Hasta 339: daba error porque el límite era demasiado bajo y nos ha borrado el usuario

350 es porque no borraba la tienda recién añadida

352, 353: al borrar la tienda debería borrar sus productos, estando en cascada

354: el icono de cesta de los nuevos productos es más grande... es por el a de 357

380: habría que verlo de otra forma porque sólo muestra las tiendas con productos... ya el lunes


*** Día 02/02/2026

No hay pantallazos porque voy al médico


*** Día 03/02/2026

GitHub Copilot es la extensión que autocompleta en VS Code

Nunca borrar tarifas, sólo activar/desactivar para mantener el histórico

45: una tarifa borrada

46: no se necesita name porque no es un formulario, JS sólo necesita el id

... se loga en Github para que autocomplete

63 lleva a 62

67 es una copia desde el otro programa

70, 71: $tarifa lleva comillas porque es un char
76: algo ha ido mal... era porque había dos conceptos llamados tarifa

81: evento onchange, recoge el cambio al moverse a otro campo
82: modifica la copia de lo de arriba

92: copia addtarifa para los extras
103 es un ejemplo de autocompletar del GitHub
113: llega un 1 por el onchange. Es decir, ya recoge los cambios de lo recién introducido

Hasta 121: al pasar de 5.0 a 5.2 ya aparecen los decimales

128: es un if de JS, escrito de otra forma

133: faltaba enviar también activo

141, 140: para hacer más grande el cuadro

148: otra copia e ir adaptando

170: al actualizar lo dejaba inactivo... se corrige en 173, 174

198: Alfonso prefiere usar text a tel. Por si quieres meter extensiones y demás

200: aquí con que pongas el required en uno te lo coge para todo el grupo radio

214, 216: para discriminar por extensión de imagen

220: se añade el enctype para poder enviar los ficheros, que se reciben como $_FILES, no como $_POST

221: la foto en este caso queda en /home/gestion/tmp, y habrá que recogerlo desde allí

https://www.php.net/manual/es/features.file-upload.post-method.php
$_FILES['userfile']['tmp_name'] devuelve eso, el nombre temporal del fichero que será cargado en la máquina servidor.

229: mueve la foto al destino que hemos creado
... pero si metemos un ejecutable disfrazado de jpg lo que ha propuesto la IA no es muy seguro: 230 y 231 para confirmar la cabecera del archivo

Hasta 255: es un formulario, hace falta ponerles name para que envíen la información que recogen
256: en la línea 6 ponía email en vez de mail

268: restrict, borrar un descuento no borra clientes

285: si no se selecciona nada se envía un 0, línea 73


*** Día 04/02/2026

11: label for es para unir los dos fecha_nacimiento

53: lo de integrity es una clave como de garantía de que viene de la web correcta, pero no tiene funciones de programa

72: object-fit: cover; es para ver de una imagen rectangular sólo la parte central, si seleccionas un marco cuadrado como en este caso
74: pero no lo aplica... 80: había que poner licliente

95: faltaba una letra en esa línea 28

https://gestion.patronfightclub.com/home.php
https://gestion.patronfightclub.com/home.php
patronfclub@yahoo.com
patron69
fotos de menos de 2MB

120: like "%pe%"... % equivale a cualquier cosa
129: para ver en inglés cosas como carga útil
143: opciones de GitHub

148 a 150: hay que cambiarlo por id
169: otra i más porque se añade $id

170 a 172: se cambia la notación
179: no recoge el cambio de imagen... ctrl+F5
Lo intenta resolver usando otro GET, para forzar que lo actualice (181)

196: no está haciendo el efecto de jquery ui
... es por el CSS, se trata de hacerle cambios que no afecten al resto del programa

210: por padding lo que antes iba por margin

Un padding también se puede poner en negativo

264: coge el mes actual

270: no lo mete en el CSS por no romper los formatos

280: en la línea 22 faltaba una '

285: para buscar el error

... parece que hay descuento pero no se muestra, jejeje


Se me ocurre... ¿manejar fechas de desactivar-reactivar trabajador, tabla de ingresos previstos, duplicar id's???


*** Día 05/02/2026

35: es tras aumentar el valor del scale

38: activo no puede ir al final, tiene que ser id

El checkbox sólo se manda cuando está activo, entonces manda lo que le digamos

53: marcando 3 campos y haciéndolos únicos te hace único el trío, no cada uno por separado
Resulta un campo único y no hace falta un if para filtrar

Para los impagos opta por controlar la fecha de activación
... aunque en 69 saltamos a un historial de impagos

90: queda cubierto el caso de baja en 2023 y regreso en 2025
96: simplificación de código
... y al desactivarlo desaparecen los impagos

100: no actualiza el mail porque en esta línea 34 tenía una i en vez de una s... al actualizar te llevaba un 0

Hay i's (integer) que realmente eran d's (double)... en esos casos al editar clientes no hubiera cogido los decimales en descuentos, tarifas...

now() te coge el día-hora actuales, pero con otro formato

173: pagarmatricula no es pagarmatrícula, discrimina por la tilde, por eso daba el error
176: $.post, no $_post, por eso daba el error anterior


Planes siguientes:
Gestión de horarios
Listado de impagados
Envíos de mails de newsletter, incluso filtrando según sexo, menores o no...

API REST
Programación orientada a objetos


*** Día 06/02/2026


Hasta 11: la fecha de activación es la que sirve de control para los impagos
12: elimina un pago de forma manual en la bdd y este es el resultado
Después realiza pagos

15: un usuario inactivo no deja nada pendiente

Desde 17: la fecha de matrícula no es necesaria al editar, sólo en el alta... La quita y luego da error porque tiene que quitar su s

24: tras pagar la matrícula
25: cambia en bdd la fecha de matrícula y sale esto
26: impagos.php parte como copia de home

30: aquí sólo interesan los activos

34, 35: vemos dónde está el menú para modificarlo

EJERCICIO: sacar sólo los impagados, por matrícula y por mensualidades
Para ello nos exporta la bdd de clientes y nos comprime lo que va de programa

41, 42: mi máquina de Debian se había quedado en un bucle... Cierro y arranco de nuevo y ya bien
(Espero que el abrupto cierre no haya tenido efectos negativos de cara al futuro)


Entiendo que
$mysqli = new mysqli("localhost", "gestion", "UN9KjWI4pkyXjANBzPTI1Enlg", "gestion"); 
pasa a ser
    $mysqli = new mysqli("localhost", "arturo", "arturo@123456", "arturo");

Ok, me aprovecho de la parte de pagos del cliente para ir trazando impagos.php. Lo que encuentro ahí me sirve de base para definir por un lado los impagados de matrícula y los impagados de mensualidad, sólo me hace falta quitar lo que se pinta en pantalla y recuperar       $year_actual = date("Y"); que creo que no estaba. Con eso y un par de variables que me invento ya tengo definidos los impagados

71: duplico desde la línea hasta la 172, para ya irlos mostrando por separado... Tal vez tenga que readaptar las etiquetas de lista después...

Espera, que mis dos simples variables tendrían que ser un array, si quiero que me valgan para todos los clientes... a no ser que integre el procedimiento en cada decisión de pintar o no al cliente... ok, eso haré


Base de código que reparto entre las dos partes:

                <!-- Desde el <div id="tabs-2"> de cliente.php. Mantengo los div porque me da la gana -->

                <div id="tabs-2">
                    <div class="formadd">

                        <?php
                        $impagomat = 0;
                        $fecha1 = new DateTime(date('Y-m-d', strtotime($cliente['fecha_matricula'])));
                        $fecha2 = new DateTime(date("Y-m-d"));
                        $intervalo = $fecha1->diff($fecha2);
                        if ($intervalo->format('%a') > 365) {
                            $impagomat = 1;
                        } ?>

                    </div>



                    <div class="formadd">
                        <?php
                        $impagomes = 0;
                        $mes_actual = date("n");
                        $meses = [
                            1 => "Enero",
                            2 => "Febrero",
                            3 => "Marzo",
                            4 => "Abril",
                            5 => "Mayo",
                            6 => "Junio",
                            7 => "Julio",
                            8 => "Agosto",
                            9 => "Septiembre",
                            10 => "Octubre",
                            11 => "Noviembre",
                            12 => "Diciembre"
                        ];
                        $year_actual = date("Y");
                        ?>

                        <?php
                        $mes_activado = date("n", strtotime($cliente["fecha_activacion"]));
                        $year_activado = date("Y", strtotime($cliente["fecha_activacion"]));
                        ?>

                        <?php
                        if ($cliente['activo'] == 1) {
                        ?>
                            <ul id="historialimpagos">
                                <?php
                                for ($y = $year_activado; $y <= $year_actual; $y++) {
                                    if ($y == $year_activado) {
                                        $mi = $mes_activado;
                                    } else {
                                        $mi = 1;
                                    }
                                    if ($y == $year_actual) {
                                        $mf = $mes_actual;
                                    } else {
                                        $mf = 12;
                                    }
                                    for ($m = $mi; $m <= $mf; $m++) {
                                        $pago = $mysqli->query("SELECT id FROM pagos WHERE cliente = " . $cliente['id'] . " AND mes = $m AND year = $y");
                                        if ($pago->num_rows == 0) {
                                            $impagomes = 1;
                                        }
                                    }
                                }
                                ?>
                            </ul>

                        <?php
                        }
                        ?>




                    </div>
                </div>


                <!-- Volvemos al fichero original -->



76 a 79: una vez finalizado el proceso de integración, a falta de retocar o duplicar las etiquetas ul si fuera necesario, paso a borrar la base que he puesto aquí arriba, ya la tengo repartida entre sus dos sectores

80: me gusta lo que he ido consiguiendo por mí mismo en un entorno tranquilito, quedaría probarlo para confirmar si quito algunos div de los que he copiado y cuántos y si va bien lo de la ul, si tengo que crear dos ul o si meto los títulos en un li. Con eso y un bizcocho no comería y cenaría a las ocho.

83, 85: marditoh roedoreh, que la parte de impagos de las mensualidades NO me funciona.

No veo el error... ¿será que hay que lanzar otra vez $clientes = $mysqli->query("SELECT * FROM clientes WHERE id > 0 and activo = 1 ORDER BY id desc LIMIT 100");, antes de un nuevo while ($cliente = $clientes->fetch_assoc()) {????

89: Alfonso me contesta que no, que con una vez vale... pero que me hace falta un data_seek para devolver al puntero al comienzo. Ok, interpreto que va a ser ese el problema

93, 94: encuentro en los archivos de este programa un formato $tarifas->data_seek(0);
así que interpreto que necesito un $clientes->data_seek(0);
… y Errol Flynn me confirma en 95 que sí, que estaba en lo cierto. Ya podemos descorchar la cerve, Errol

https://arturo.avisando.com/patron/impagos.php

Se me ocurre pensar que tal vez hubiera servido de la otra forma, repitiendo el $clientes = $mysqli->query… pero lo dejo así

RESULTADO FINAL:

<?php
include_once("includes/prohibir.php");
?>
<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Zona Privada Gestión Patron Fight Club</title>

    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.0.1/css/all.min.css" integrity="sha512-2SwdPD6INVrV/lHTZbO2nodKhrnDdJK9/kg2XD1r9uGqPo1cUbujc+IYdlYdEErWNu69gVcYgdxlmVmzTWnetw==" crossorigin="anonymous" referrerpolicy="no-referrer" />
    <link rel="stylesheet" href="style.css">
    <script src="https://code.jquery.com/jquery-4.0.0.js"></script>

    <script src="js.js"></script>



</head>

<body>
    <header>
        <div>
            <div onclick="menu();"><i class="fa-solid fa-bars"></i></div>
            <div>Clientes con Impagos</div>
            <div></div>
        </div>
        <nav>
            <ul>
                <li><a href="home.php">Clientes</a></li>
                <li><a href="addcliente.php">Nuevo Cliente</a></li>
                <li><a href="impagos.php"><strong>Impagos</strong></a></li>
                <li><a href="tarifas.php">Tarífas</a></li>
                <li><a href="horarios.php">Horarios</a></li>
                <li><a href="mailing.php">Mailing</a></li>
                <li><a href="material.php">Material</a></li>
                <li><a href="cerrar.php">Cerrar Sesión</a></li>
            </ul>
        </nav>
    </header>

    <?php
    if (isset($_GET['error'])) {
        echo "<div class='error'>Se ha producido un error</div>";
    }

    ?>
    <main>
        <div>
            <ul class="listados">
                <?php
                $clientes = $mysqli->query("SELECT * FROM clientes WHERE id > 0 and activo = 1 ORDER BY id desc LIMIT 100");
                ?>

                <!-- Cojo código del <div id="tabs-2"> de cliente.php. Mantengo los div porque me da la gana. Cuidado con las ul -->

                <h2 style="font-size: 1.1em;"><i class="fa-solid fa-list-check"></i> Impagados Matrícula </h2>
                <?php
                while ($cliente = $clientes->fetch_assoc()) {
                    $activo = "";
                    if ($cliente['activo'] == 0) {
                        $activo = "inactivo";
                    }



                    $impagomat = 0;
                    $fecha1 = new DateTime(date('Y-m-d', strtotime($cliente['fecha_matricula'])));
                    $fecha2 = new DateTime(date("Y-m-d"));
                    $intervalo = $fecha1->diff($fecha2);
                    if ($intervalo->format('%a') > 365) {
                        $impagomat = 1;
                    }

                    if ($impagomat == 1) {

                ?>
                        <li class="licliente <?php echo $activo; ?>" id="cliente_<?php echo $cliente['id'] ?>">
                            <div>
                                <?php
                                if (file_exists("fotos/" . $cliente['id'] . ".jpg")) {
                                ?>
                                    <img src="fotos/<?php echo $cliente['id'] ?>.jpg" alt="Foto de <?php echo $cliente['nombre'] ?>">
                                <?php
                                } else {
                                ?>
                                    <img src="fotos/nofoto.jpg" alt="Sin foto">
                                <?php
                                }
                                ?>
                            </div>
                            <div>
                                <strong>#<?php echo $cliente['id'] ?> <?php echo $cliente['nombre'] ?></strong><br>
                                DNI: <?php echo $cliente['dni'] ?><br>
                                Teléfono: <a href="tel:<?php echo $cliente['telefono'] ?>"><?php echo $cliente['telefono'] ?></a>
                            </div>
                            <div>
                                <a href="cliente.php?id=<?php echo $cliente['id'] ?>"><i class="fa-solid fa-angles-right"></i></a>
                            </div>
                        </li>
                <?php
                    }
                }
                ?>

                <h2 style="font-size: 1.1em;"><i class="fa-solid fa-list-check"></i> Impagados Mensualidades </h2>
                <?php
                $clientes->data_seek(0);
                while ($cliente = $clientes->fetch_assoc()) {
                    $activo = "";
                    if ($cliente['activo'] == 0) {
                        $activo = "inactivo";
                    }

                    $impagomes = 0;
                    $mes_actual = date("n");
                    $meses = [
                        1 => "Enero",
                        2 => "Febrero",
                        3 => "Marzo",
                        4 => "Abril",
                        5 => "Mayo",
                        6 => "Junio",
                        7 => "Julio",
                        8 => "Agosto",
                        9 => "Septiembre",
                        10 => "Octubre",
                        11 => "Noviembre",
                        12 => "Diciembre"
                    ];
                    $year_actual = date("Y");

                    $mes_activado = date("n", strtotime($cliente["fecha_activacion"]));
                    $year_activado = date("Y", strtotime($cliente["fecha_activacion"]));


                    if ($cliente['activo'] == 1) {
                ?>
                        <ul id="historialimpagos">
                            <?php
                            for ($y = $year_activado; $y <= $year_actual; $y++) {
                                if ($y == $year_activado) {
                                    $mi = $mes_activado;
                                } else {
                                    $mi = 1;
                                }
                                if ($y == $year_actual) {
                                    $mf = $mes_actual;
                                } else {
                                    $mf = 12;
                                }
                                for ($m = $mi; $m <= $mf; $m++) {
                                    $pago = $mysqli->query("SELECT id FROM pagos WHERE cliente = " . $cliente['id'] . " AND mes = $m AND year = $y");
                                    if ($pago->num_rows == 0) {
                                        $impagomes = 1;
                                    }
                                }
                            }
                            ?>
                        </ul>

                    <?php
                    }
                    if ($impagomes == 1) {
                    ?>


                        <li class="licliente <?php echo $activo; ?>" id="cliente_<?php echo $cliente['id'] ?>">
                            <div>
                                <?php
                                if (file_exists("fotos/" . $cliente['id'] . ".jpg")) {
                                ?>
                                    <img src="fotos/<?php echo $cliente['id'] ?>.jpg" alt="Foto de <?php echo $cliente['nombre'] ?>">
                                <?php
                                } else {
                                ?>
                                    <img src="fotos/nofoto.jpg" alt="Sin foto">
                                <?php
                                }
                                ?>
                            </div>
                            <div>
                                <strong>#<?php echo $cliente['id'] ?> <?php echo $cliente['nombre'] ?></strong><br>
                                DNI: <?php echo $cliente['dni'] ?><br>
                                Teléfono: <a href="tel:<?php echo $cliente['telefono'] ?>"><?php echo $cliente['telefono'] ?></a>
                            </div>
                            <div>
                                <a href="cliente.php?id=<?php echo $cliente['id'] ?>"><i class="fa-solid fa-angles-right"></i></a>
                            </div>
                        </li>
                <?php
                    }
                }
                ?>

            </ul>
        </div>
    </main>

</body>

</html>


*** Día 09/02/2026

18: $fecha1 es un objeto y diff un método

Desde 29 pasamos al fichero de impagos
32: datediff es una función de mysql
33 va con php, 34 con MySQL

En mi impagos.php me falta un break; una vez que ya se ha localizado que hay impago de las mensualidades

39: 0,1,2... es el número de personas en esa clase

48, 49: al pinchar en el número aparecen las personas apuntadas a esa clase

61 no nos sirve: se van a enviar varios correos, no uno

Cada cierto tiempo hay que hacer la descarga de paquetes de actualización, a efectos de mantenimiento

El modo FCGI es el que usamos

76: es un json con los id's de los clientes, aquí la key ha desaparecido
json es el formato nativo de JS

83: en cada vuelta pasa por un id

92: recogemos código de la otra aplicación

97: se crea el correo noreply, y después se edita
100, 101: hay que borrar correos desde aquí cada cierto tiempo, porque si se queda sin sitio no podrá enviar

104: hay que instalar dkim para poder enviar, que reconozca de dónde salen esos correos... activado en 109

124: sobra el punto final

128 son las SPF1. Es donde los otros servidores verifican si el correo recibido es lícito, porque podemos enviar correos desde cualquier dominio

132: borrar lo de "   " para juntar los dos bloques

137: tras esta otra opción de seguridad, ya está configurado el servidor de envío

154 activa saltos de línea, los tiene en cuenta

Sobre 160: de nuevo las promesas

La siguiente posición no se ejecuta hasta que lo de 171 ha terminado

178: es mail, como en la bdd
177: ya le han abierto el puerto 25, se envían los mails

179: el 0 es para quitar el modo de depuración

202: revisando el error vemos que el 1 es el primero, correcto

208: desde la línea 282 se resetea por si hay un nuevo envío

217: ya no sale el /n en el correo enviado, por comentar la línea superior que se ve en 224

Los correos enviados no se almacenan (anda, como el NOMI MAIL)

224: para cubrir cuando no hay correo indicado en la ficha
225: el sleep era para hacer pequeñas paraditas de un segundo

Hasta 245 pasamos a intentar crear logos tipo favicon… realfavicongenerator.net

248: el favicon ya aparece en la pestaña del navegador

252: descarga de la aplicación en el móvil
Android: Tres botones de Chrome y Añadir a página de inicio
IOS: En IPhone es dando a la derecha de la URL y Añadir a pantalla de inicio

254: instalación en PC

275: dejaba marcar los dos porque no había name

290: tipo timestamp es para guardar de forma automatizada... además el atributo de 290 implica que actualiza el campo con la hora actual del momento

293: reutilizando código

Da igual que haya variables por fuera de una function, el programa las recoge a través del enlace al fichero .js que hay dentro de cada fichero .php

real_escape_string de nuevo como medida de seguridad, como las consultas preparadas

La tabla era operaciones, faltaba una i... y tras solucionar los errores llegamos al 1 de 315

317: las dos líneas anteriores vienen de impagos.php

325: se recoge código de cliente.php

La clase de 319 lleva a 328

… me quedaría algo antes de 344, que nos lleve a él


*** Día 10/02/2026

Ayer tuvimos incursiones en Virtualmin, con lo del correo noreply

26: volvemos a datatables.net. Cogemos el css y el cdn de la tabla (hasta 30)

32, 33: cambia los li por un tr

45: integrado como subarray

60: resuelto el bug de sacar el año seleccionado - 5 en vez de año actual - 5

72: el total es el real, no el de la página que configures

74, 75: quitamos el paginado

80, 81: tras buscar en las instrucciones del datatable

86, al actualizar la página

92: línea 297 es para recargar la página, dado que no conseguimos que salga de forma dinámica

Hay mantenimiento correctivo (corrección de errores) y mantenimiento evolutivo (transformaciones, añadidos y mejoras)


Diferencia entre utilidad de php y JavaScript, según Google
La utilidad de PHP y JavaScript radica en sus capacidades para crear sitios web dinámicos e interactivos. PHP es ideal para el desarrollo del lado del servidor, donde se manejan tareas como interacciones con bases de datos y procesamiento de formularios. JavaScript, por otro lado, se utiliza para el desarrollo del lado del cliente, donde se crean interfaces de usuario interactivas y se mejora la experiencia del usuario. Ambos lenguajes son esenciales para el desarrollo web moderno y ofrecen diferentes enfoques para lograr la misma finalidad




Usar php en un primer momento, el tratamiento posterior de esa información con JS
Además hay que tener en cuenta que la información de JS es volátil y la de PHP no... la de JS no podrá utilizarse para indexación en Google


Aula 326 10:56
https://www.tramitapp.com/blog/ley-control-horario-espana/
Los mensajes dirigidos a "Chat de grupo de la reunión" también aparecerán en el chat de grupo de la reunión en Chat en equipo

ILIAS BOUNEKOUB ASSRI 11:12
vale

JOSE MARIA VELASCO GUERRERO 11:13
PHP ^
Programación del lado del servidor.
JavaScript ^
Interactividad y lógica del frontend.
La lógica del frontend se refiere al conjunto de reglas, comportamientos e interactividad programados en el lado del cliente (navegador), utilizando principalmente JavaScript, HTML y CSS.





https://www.tramitapp.com/blog/ley-control-horario-espana/

… que la geolocalización, si es o no excesiva
También veo que me depende de SSocial, si se queja o no
En otro orden de cosas, qué bonito es hacer un casho artículo donde das 20.000 vueltas sobre lo mismo. Es decir, te cojo lo miiiiiismo adaptado a este otro temita, y así lleno líneas y líneas (*)
Que el RGDP y la LOPDGDD... ya estamos liando siglas, SNOOOOOOPY
(*) INSISTO: quien escribe esto es un master of the universe, es coger los 4 puntos que tienes claros y verlos desde todos los puntos de la rosa de los vientos, aunque sean los mismos sujetos a 4 variaciones puntuales.
Papel sin hojas sueltas... no me lo trago
Ok, a partir del punto 8 cambia la película


109, 110: por ejemplo en Verifactu se integra el hash de la operación anterior en la siguiente que tenga relacionada


tipo de horas
que estén las pausas
que se registren las modificaciones


Su tabla:
id cambio
n fact
hash
estado tv factura
respuesta
fecha


Mi programa llevaría
tabla de trabajadores: irrelevante, sólo datos personales y el idtrab interno de la empresa
horarios, tipo horarios o tarifas del patrón, la visible y enlazada con la anterior por el idtrab interno ese
la interna de horarios, que "codifica" la visible y enlaza los hash


De "aria-hidden que es" en Google
El atributo aria-hidden se utiliza para ocultar contenido de los usuarios con discapacidades visuales que navegan por la aplicación utilizando lectores de pantalla. Al agregar aria-hidden="true" a un elemento, se elimina ese elemento y todos sus hijos del árbol de accesibilidad, lo que significa que no serán anunciados por los lectores de pantalla. Esto es útil para mejorar la accesibilidad al evitar que los usuarios escuchen contenido que no es relevante para ellos. 
RESPUESTASRAPIDAS
+1


*** Día 11/02/2026

Recopilando desde ayer:

109, 110: por ejemplo en Verifactu se integra el hash de la operación anterior en la siguiente que tenga relacionada


tipo de horas
que estén las pausas
que se registren las modificaciones


Su tabla:
id cambio
n fact
hash
estado tv factura
respuesta
fecha


Mi programa llevaría
tabla de trabajadores: irrelevante, sólo datos personales y el idtrab interno de la empresa
horarios, tipo horarios o tarifas del patrón, la visible y enlazada con la anterior por el idtrab interno ese
la interna de horarios, que "codifica" la visible y enlaza los hash

***

7, 8: extrayendo desde el patron comprimido

11, 12: de "phpmyadmin prefix que es" en Google

El prefijo en phpMyAdmin (usualmente wp_ en WordPress) es una cadena de caracteres al inicio de los nombres de las tablas de una base de datos. Sirve para identificar tablas pertenecientes a una aplicación específica y, al cambiarlo, mejora la seguridad al dificultar ataques automatizados de inyección SQL que buscan prefijos por defecto.

En 11, 16, 15 lo pongo en marcha y funciona

17 es dándole al delete de esa fila, 18 es dándole al delete que está en la línea de "check all" de 17

21: borrando campos que me sobran
ALTER TABLE `conthorario_trabajadores`
  DROP `tarifa_1`,
  DROP `descuento_1`,
  DROP `extra_1`,
  DROP `tarifa_2`,
  DROP `tarifa_3`,
  DROP `descuento_2`,
  DROP `descuento_3`,
  DROP `extra_2`,
  DROP `extra_3`;

26, 27: ALTER TABLE `conthorario_trabajadores` ADD `idproducto` VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL AFTER `nombre`;

De 27 a 28: ALTER TABLE `conthorario_trabajadores` CHANGE `nombre` `nombre` VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;

De 28 a 29: ALTER TABLE `conthorario_trabajadores` CHANGE `idproducto` `apellidos` VARCHAR(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;

31: ALTER TABLE `conthorario_trabajadores` CHANGE `apellidos` `apellidos` VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;

32: ALTER TABLE `conthorario_trabajadores` CHANGE `dni` `dni` VARCHAR(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;

35:
Error in processing request
Error text: error (rejected)
It seems that the connection to server has been lost. Please check your network connectivity and server status.
(Reintenté y ya ok)

39: ALTER TABLE `conthorario_trabajadores` ADD `numss` VARCHAR(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL AFTER `dni`, ADD UNIQUE (`numss`);
Ok, mejor como varchar que como int

44: vaya, no me ha dado la sentencia SQL

45: ALTER TABLE `conthorario_trabajadores` CHANGE `mail` `mail` VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;

Por ejemplo, el cambio de 46 a 47 sería 48:
ALTER TABLE `conthorario_trabajadores` CHANGE `telefono` `telefono` varchar(15) NOT NULL AFTER `apellidos`, CHANGE `mail` `mail` varchar(100) NOT NULL AFTER `telefono`

50: ALTER TABLE `conthorario_trabajadores` CHANGE `fecha_matricula` `fecha_alta` DATE NOT NULL;

51: ALTER TABLE `conthorario_trabajadores` CHANGE `fecha_alta` `fecha_alta_no` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;

52: ALTER TABLE `conthorario_trabajadores` CHANGE `fecha_matricula` `fecha_alta` DATE NOT NULL;


56:
ALTER TABLE `conthorario_trabajadores` CHANGE `fecha_activacion` `fecha_activacion` date NOT NULL DEFAULT current_timestamp() AFTER `fecha_alta`
ALTER TABLE `conthorario_trabajadores` CHANGE `fecha_activacion` `fecha_activacion` DATE NOT NULL;
ALTER TABLE `conthorario_trabajadores` CHANGE `fecha_activacion` `fecha_baja` DATE NOT NULL;




tipos de pausa
añadir horas extra, complementarias... etc
hay turnos de 22:00 a 05:00
registro de horas tipo Sage

arturo@test.com y 1234


60: ALTER TABLE `conthorario_trabajadores` CHANGE `activo` `activo` TINYINT(4) NOT NULL DEFAULT '1' COMMENT '1 en plantilla, 0 despedido';

62: Type de campo ENUM para en vez de usar 0-1-2 usar los valores reales: inspector-delegado... etc

61: Do you really want to execute "ALTER TABLE `conthorario_trabajadores` DROP `fecha_alta_no`;"?

64, 65: ALTER TABLE `conthorario_trabajadores` ADD `permisos` TINYINT UNSIGNED NOT NULL DEFAULT '0' COMMENT '0 trabajador normal, 1 con permisos' AFTER `activo`;

70: añadiendo tabla CREATE TABLE `arturo`.`conthorario_fichajes` () ENGINE = InnoDB;

86:
CREATE TABLE `arturo`.`conthorario_fichajes` (`idintervalo` INT(10) NOT NULL AUTO_INCREMENT , `idtrabajador` INT(10) UNSIGNED NOT NULL , `fecha_fichaje` DATE NOT NULL , PRIMARY KEY (`idintervalo`, `idtrabajador`)) ENGINE = InnoDB;

89: ALTER TABLE `conthorario_fichajes` ADD UNIQUE(`idtrabajador`);

92: ALTER TABLE `conthorario_fichajes` DROP INDEX `idtrabajador_2`;

94: ALTER TABLE `conthorario_fichajes` DROP INDEX `idtrabajador`;

95: y me ha borrado las unique (se ve que lo hice dos veces)

96: ALTER TABLE `conthorario_fichajes` DROP PRIMARY KEY; entiendo que me borraría las dos, voy a editar

99: ALTER TABLE `arturo`.`conthorario_fichajes` DROP PRIMARY KEY, ADD PRIMARY KEY (`idintervalo`) USING BTREE;

101: ALTER TABLE `conthorario_fichajes` ADD UNIQUE(`idtrabajador`);


*** Día 12/02/2026

Hasta 38 instalamos OBS

Scractching: extraer información de páginas externas, y recogerla en formato json

Simple HTML DOM Parser
Un DOM es un árbol
49: Descargamos esta librería de parseado, que es la mejor

53 lleva a 52

Coge el curl de la web y en la terminal de Debian funciona, así que lo incluye en el php

Coge la petición que ha hecho por curl y la redirige con sh portada.sh... yllegamos a 72

Cada "hola" de un echo "hola" que mete es una noticia

var_dump es para que vuelque el contenido (77), luego añade un pre para organizarlo (78)

103, 104: esa no la elimina, no sabemos por qué

115: funciona, había espacios entre El y Comidista (se veían en el código fuente)

119, 120: había h2 que no tienen un a dentro, para esos aplica el continue

130, 131: llega la foto, ahora queda extraer de eso el src

134: la imagen lleva un get de autorización

147: para los casos sin foto en el artículo

Las imágenes salen del lado del cliente... verán la IP del cliente

169: ya quitado el border-radius

180: en ese curl está toda la noticia

186: ya funciona la ejecución que daba error antes en la línea 2, porque ese curl_init() no estaba registrado a nivel de terminal
La petición de la consola es tcp/ip, no http

202: haces clic y sale el cuadro

ancho * 0,95 y altura * 0,7
215: confirmamos que sale un scroll

219: la petición por get no funciona, hay que hacerla desde el servidor

221: sí, ejecuta bien php noticia.php

232: recoge lo de antes en el nuevo archivo

243: mysqli no funciona en modo consola, no sabemos por qué... es porque en local no había bdd, donde está la bdd es en el servidor

El modo CLI es poder mandar órdenes desde la terminal de VSCode, desde la consola.... así que por un json

261, 262: json generado

268: la ejecución va a tardar, es un json muy grande

274: pasar el json a array


*** Día 13/02/2026


12: ¿estructura de objeto y acción sobre él?

45: $foto es la url de la imagen

52, 53: ejecutamos desde el servidor esta vez

67: ping nos da la ip

Le hizo un nano a elpais.es

78, 79: la diferencia de orden da igual

83: copia desde el estado anterior del fichero, que ve en la línea de tiempo

clear para cls de la terminal

103: ha borrado todas las imágenes tras truncar la bdd

106, 107: ahora sí llegan las imágenes y podemos servir las nuestras (se ve en 115)

113, 114: eso descuadra el marco

121: ahora rompe demasiado

No aplicaba el cambio en la fuente porque en el CSS no llamaba al id, cuando usa la # ya funciona y lo aplica
145 era con un justify

151: pwd te dice dónde estás

154: regreso tras un corte de luz

La orden tiene que comenzar por php
159 era para borrar las imágenes
160 cambia a expresiones absolutas

165: finaliza el proceso y ya llegamos a 166 con las noticias

Virtualmin es algo aparte de clouding, y es gratuito

177 es la petición original

178 es el código de la acción

Vamos a los json

185: sólo hay que cambiar el código final

Es una API a las que se le hace peticiones vía web, y se devuelve un json

191: es sólo parsear un json externo, y un json se puede pasar a un array


*** Día 15/02/2026

27: ALTER TABLE `conthorario_trabajadores` CHANGE `permisos` `permisos` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' COMMENT '0 trabajador normal, 1 con permisos';


28: ALTER TABLE `conthorario_trabajadores` ADD `trabajando` INT(4) NOT NULL AFTER `permisos`;

30: ALTER TABLE `conthorario_trabajadores` CHANGE `trabajando` `trabajando` INT(4) UNSIGNED NOT NULL DEFAULT '0' COMMENT '1 trabajando, 0 resto';

Dudas:
Tenemos interdominios y luego clouding… ¿Si dejo la web en mi equipo para mi propio acceso personal puedo entender que me ahorro clouding?
¿qué diferencia hay entre int(4), int(3)…? ¿Un campo 0-1 puede ser int(1), boolean o de otro tipo?
Sentido de relaciones: si tengo la tabla de fichajes con el idtrabajador de la tabla de trabajadores... al meter borrado en cascada entiendo que quiere decir que si borro trabajador se borran los fichajes, ¿no? Lo digo por si es viceversa, tu piel morena sobre la arena, nadas igual que una sirena
¿Diferencia entre varchar y text? Creo que esto ya estaba explicado

32: ALTER TABLE `conthorario_pausas` CHANGE `npausa` `npausa` VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;

34: DROP TABLE `aa`

36: CREATE TABLE `arturo`.`aa` (`idpausa` INT(4) NOT NULL , `npausa` INT(50) NOT NULL ) ENGINE = InnoDB;
(porque no registré lo anterior a 32)

42: INSERT INTO `conthorario_pausas` (`idpausa`, `npausa`) VALUES ('1', 'Fin jornada')

45: INSERT INTO `conthorario_pausas` (`idpausa`, `npausa`) VALUES ('3', 'Formación');

47: INSERT INTO `conthorario_pausas` (`idpausa`, `npausa`) VALUES ('5', 'Pausa sin determinar');

52: INSERT INTO `conthorario_pausas` (`idpausa`, `npausa`) VALUES ('6', 'Externo - Inspeccionando');

56: ALTER TABLE `conthorario_trabajadores` ADD `idpausa` INT(4) UNSIGNED NOT NULL DEFAULT '5' AFTER `trabajando`;

59: ok, por lo que veo aquí LOS CLIENTES son los que llevan tarifas y descuentos, y no viceversa (luego veo que no hay relaciones en esas tablas)… y todo es restrict, entiendo que porque borrar cliente no lleva a borrar tarifas y descuentos

62: ALTER TABLE `conthorario_trabajadores` ADD FOREIGN KEY (`id`) REFERENCES `conthorario_fichajes`(`idtrabajador`) ON DELETE CASCADE ON UPDATE CASCADE;

64: ALTER TABLE `conthorario_trabajadores` ADD FOREIGN KEY (`id`) REFERENCES `conthorario_fichajes`(`idtrabajador`) ON DELETE CASCADE ON UPDATE CASCADE;
Eso es, coincide

66: horror, ni siquiera me deja ponerle relación desde la tabla de trabajadores... Vendría bien ver si me vale con un unique, por ejemplo, pero la tabla de pausas no es unique en su id ni por asomo... 

67: venga, meto un unique sin invocar a Amunike
… 68: pues sí, me vale cualquier índice. Una vez visto esto le cambio a primary, pero mi idea de la vida, del amor y de las tablas no cree que esta tabla tuviera que estar indizada, sólo lo haré porque me obligan. Le meteré una primary y fuera

69: ALTER TABLE `conthorario_pausas` DROP INDEX `idpausa`;

71: ALTER TABLE `conthorario_pausas` ADD PRIMARY KEY(`idpausa`);

Duda, 73: ¿y si tienes 75000 variables cómo gestionas esto???

75: ALTER TABLE `conthorario_trabajadores` ADD FOREIGN KEY (`idpausa`) REFERENCES `conthorario_pausas`(`idpausa`) ON DELETE RESTRICT ON UPDATE RESTRICT;

76: ALTER TABLE `conthorario_trabajadores` ADD FOREIGN KEY (`idpausa`) REFERENCES `conthorario_pausas`(`idpausa`) ON DELETE RESTRICT ON UPDATE RESTRICT;


*** Día 16/02/2026

7: aquí no guarda las DNS y por eso no actualiza bien lo de las noticias

Parece que no es capaz de conectarse al exterior por dominios

9: resolv.conf es el fichero que lleva las DNS

12: pone en el fichero con el nano lo que ha visto en stack overflow (14, 15) y guarda con ctrl+X… reboot es reiniciar el servidor
A través de esa terminal ha hecho un apt para borrar temporales y otros ficheros innecesarios... apt autoremove


APIs: 

Un json lleva información que necesitamos transmitir entre equipos

21: pasos sería un array

El json tiene una estructura flexible, es la serialización de objetos JS
Un json es nativo de JS

XML es más potente que json, pero menos flexible

23: esta web sería un endpoint
Los elementos pueden ser parseados

Recoge la funcionalidad de tabs con jQuery, elimina una línea, añade alguna tab más (28)

json_decode convierte el json en un array

36: index es la posición

38: podemos reducir el código porque queda automatizado

https://javier.avisando.com/php/api/a.txt

https://javier.avisando.com/php/api/a.json

55: poner en la línea 35 la ruta anterior

56 a 58: al decodificar y recodificar quedará bien guardado como un json… en https://javier.avisando.com/php/api/recetas.php

Si se ponen otras recetas en el json lo que mostrará el programa será diferente

67: prefiere inicializar así el array, como en la línea 4

Después creamos un array de noticias (hasta 79)

https://javier.avisando.com/php/noticias/api.php es un endpoint para crear una aplicación aparte de noticias

85: una vez descargado desde el servidor, ese fichero es más eficiente porque es estático, en cambio el de 86 lleva unos tiempos de proceso

En 88 vemos que consume más recursos de la otra forma

https://javier.avisando.com/php/noticias/noticias.json

92: es diferente que en la virtual de clase, aquí al hacer doble clic directamente me extrae el contenido, no recuerdo que allí fuera igual... ok, ya entiendo por qué: mi virtual es Debian 13, la de allí es Debian 12

100 es por 101, pienso... por de pronto hago un upload folder para que esto suba al servidor

Parece que con eso resuelvo el primer error, el de "No such file", pero tengo lo de 102, imagino que por 103.

102: Fatal error: Uncaught Error: Call to a member function fetch_assoc() on array in /home/arturo/public_html/php/vernot/index.php:55 Stack trace: #0 {main} thrown in /home/arturo/public_html/php/vernot/index.php on line 55

103: En PHP, fetch_assoc se usa para obtener una fila de resultados de una consulta MySQL como un array asociativo, donde las claves son los nombres de las columnas. Se utiliza en MySQLi (extensión moderna de PHP para MySQL)

Entiendo que si ya tengo un array no tiene sentido generar otro array... Entiendo que debo ir a un foreach

Es decir, pasar de
        while ($noticia = $resultado->fetch_assoc()) {
a algo parecido a 
foreach ($recetas as $index => $receta) {
En la estructura anterior los echo los hace sobre los parámetros de $receta, y aquí yo quiero que lo haga sobre $noticia, partiendo de $resultado... Probaré con esto:
foreach ($resultado as $index => $noticia) {

Premio, 104 me lleva a 105, aunque tengo el error "Warning: Undefined array key "img" in /home/arturo/public_html/php/vernot/index.php on line 56" en las noticias sin foto

Después 111 me sigue llevando a 112, conjunto vacío. Pero sin errores que me orienten... A ver si quitando las comillas de la línea 16...

La API es el que genera el json de manera dinámica
Le damos al cliente un endpoint, una URL, que va por el método GET 
(Métodos existentes: get, post, delete, push)
La API es algo intermedio entre la bdd y la aplicación

… No, si le quito las comillas ya no me sale ni el recuadro (114, 115)


ESTADO ACTUAL:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Noticias</title>

    <link rel="stylesheet" href="https://code.jquery.com/ui/1.14.2/themes/base/jquery-ui.css">

    <script src="https://code.jquery.com/jquery-3.7.1.js"></script>
    <script src="https://code.jquery.com/ui/1.14.2/jquery-ui.js"></script>
    <script>
        function modal(key) {
/*             $.get("includes/noticia.php?key=" + key, function(data) { */
            $.get($noticia['noticia'], function(data) {
                $("#dialog-message").html(data);
            });
            let alturaventana = $(window).height() * 0.8;
            let anchoventana = $(window).width() * 0.95;
            $("#dialog-message").dialog({
                modal: true,
                /*                 position: {
                                    my: "top",
                                    at: "center",
                                    of: "header"
                                }, */
                height: alturaventana,
                width: anchoventana,
                buttons: {
                    Cerrar: function() {
                        $(this).dialog("close");
                    }
                }
            });
        }
    </script>



    <link rel="stylesheet" href="style.css">
</head>

<body>

    <main>
        <h1>Noticias Portada</h1>
        <?php

        /*  include_once('includes/datos.php'); */

        $json = file_get_contents("noticias.json");
        $resultado = json_decode($json, true);

        echo "<ul class='listados'>";
        foreach ($resultado as $index => $noticia) {
            if ($noticia['img'] != "") {
                echo "<li class='confoto'><div><img src='{$noticia['img']}' alt='Imagen noticia'></div><div onclick='modal({$noticia['id']})'><h2>" . $noticia['titulo'] . "</h2><p>" . $noticia['texto'] . "</p>  </div></li>";
            } else {
                echo "<li class='sinfoto'><div onclick='modal({$noticia['id']})'><h2>" . $noticia['titulo'] . "</h2><p>" . $noticia['texto'] . "</p>  </div></li>";
            }
        }
        ?>
        </ul>


        <div id="dialog-message" title="Noticia completa">
        </div>
    </main>
</body>

</html>

https://ilias.avisando.com/php/noticias/index.php
https://jose.avisando.com/php/noticias/


Busco en Google "direccionar evento onclick hacia un archivo":

Claro 😊. Si lo que quieres es que un evento onclick en HTML/JavaScript lleve al usuario a un archivo (por ejemplo, un PDF, imagen o documento), tienes varias formas de hacerlo dependiendo de si el archivo está en tu servidor o en una URL externa.

Aquí te dejo tres formas:

1. Usando un enlace directo en HTML

Html

Copiar código
<button onclick="window.location.href='documento.pdf'">
  Ver archivo
</button>
Esto redirige al archivo y el navegador lo abrirá o descargará según su configuración.

2. Forzando descarga con atributo download

Html

Copiar código
<a href="documento.pdf" download>
  <button>Descargar archivo</button>
</a>
El atributo download intenta que el archivo se descargue en lugar de abrirse.

3. Usando JavaScript para abrir en nueva pestaña

Html

Copiar código
<button onclick="window.open('documento.pdf', '_blank')">
  Abrir archivo
</button>
Esto abre el archivo en una nueva pestaña, ideal para no interrumpir la navegación.

💡 Tip: Si el archivo está en otra carpeta, usa la ruta relativa (/archivos/documento.pdf) o absoluta (https://tusitio.com/documento.pdf).

Si quieres, puedo prepararte un ejemplo donde el onclick apunte a un archivo y además registre la descarga en un log para estadísticas. ¿Quieres que lo haga?


Deshacer

Rehacer

Copiar




Perfecto 😄.
Aquí tienes un ejemplo donde el botón con onclick abre o descarga un archivo y además registra la acción en un log (simulado con una petición a un script PHP o API).

Ejemplo: Botón que abre un archivo y registra la descarga
Html<!-- Botón para abrir el archivo -->
<button onclick="registrarYDescargar()">📄 Ver archivo</button>

<script>
function registrarYDescargar() {
    // 1. Registrar la acción en el servidor (simulación con fetch)
    fetch('/registrar_descarga.php', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ archivo: 'documento.pdf', fecha: new Date().toISOString() })
    })
    .then(response => {
        if (!response.ok) throw new Error('Error al registrar');
        console.log('Descarga registrada correctamente');
    })
    .catch(error => console.error('Error:', error));

    // 2. Abrir el archivo en nueva pestaña
    window.open('documento.pdf', '_blank');
}
</script>


Archivo registrar_descarga.php (ejemplo básico en PHP)
Php<?php
// Recibir datos JSON
$data = json_decode(file_get_contents("php://input"), true);

// Guardar en un log de texto
$log = date("Y-m-d H:i:s") . " - Archivo: " . $data['archivo'] . "\n";
file_put_contents("descargas.log", $log, FILE_APPEND);

// Respuesta
http_response_code(200);
echo json_encode(["status" => "ok"]);
?>


🔹 Cómo funciona:

Cuando el usuario hace clic, se envía un registro al servidor con el nombre del archivo y la fecha.
Luego, el archivo se abre en una nueva pestaña.
En el servidor, el PHP guarda la información en un archivo descargas.log.

Si quieres, puedo adaptarte este ejemplo para que fuerce la descarga en lugar de abrir el archivo.
¿Quieres que lo prepare así?


Otra búsqueda: "direccionar un div html hacia un archivo php"

Si quieres "direccionar" un <div> HTML hacia un archivo PHP, primero hay que aclarar que un <div> por sí mismo no puede "redirigir" o "enlazar" a otro archivo.
Lo que puedes hacer es:

Hacer clic en el <div> y abrir un archivo PHP (redirección).
Cargar contenido de un archivo PHP dentro del <div> (sin recargar toda la página, usando AJAX).

Te muestro ambas opciones.

1️⃣ Redirigir al hacer clic en el <div>
Html<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Redirigir con un DIV</title>
<style>
    .clickable {
        width: 200px;
        height: 100px;
        background-color: lightblue;
        display: flex;
        align-items: center;
        justify-content: center;
        cursor: pointer;
        border: 1px solid #000;
    }
</style>
</head>
<body>

<div class="clickable" onclick="window.location.href='pagina.php'">
    Ir a PHP
</div>

</body>
</html>

💡 Cómo funciona:
Cuando el usuario hace clic en el <div>, el navegador carga pagina.php.

2️⃣ Cargar contenido de un archivo PHP dentro del <div> (AJAX)
Esto es útil si quieres mostrar el contenido de un PHP sin recargar la página.
Html<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Cargar PHP en un DIV</title>
<style>
    #contenido {
        border: 1px solid #000;
        padding: 10px;
        width: 300px;
        min-height: 100px;
    }
</style>
</head>
<body>

<button onclick="cargarContenido()">Cargar contenido PHP</button>
<div id="contenido">Aquí aparecerá el contenido del PHP</div>

<script>
function cargarContenido() {
    fetch('contenido.php') // archivo PHP que devuelve HTML o texto
        .then(response => {
            if (!response.ok) throw new Error("Error al cargar el archivo");
            return response.text();
        })
        .then(data => {
            document.getElementById('contenido').innerHTML = data;
        })
        .catch(error => {
            document.getElementById('contenido').innerHTML = "Error: " + error.message;
        });
}
</script>

</body>
</html>

📌 contenido.php (ejemplo simple):
Php<?php
echo "<strong>Hola desde PHP</strong>";
?>


✅ Conclusión

Si quieres navegar a un PHP → usa onclick con window.location.href.
Si quieres mostrar contenido de PHP dentro del div → usa AJAX (fetch o XMLHttpRequest).


Si quieres, puedo prepararte un ejemplo mixto donde el <div> se vea como un botón y cargue el PHP dentro de sí mismo sin recargar la página.
¿Quieres que te lo haga así?



Perfecto ✅
Aquí tienes un ejemplo mixto donde el <div> parece un botón y, al hacer clic, carga el contenido de un archivo PHP dentro de sí mismo sin recargar la página.

HTML + CSS + JS
Html<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>DIV que carga PHP</title>
<style>
    .caja {
        width: 250px;
        height: 100px;
        background-color: #4CAF50;
        color: white;
        display: flex;
        align-items: center;
        justify-content: center;
        cursor: pointer;
        border-radius: 8px;
        font-size: 18px;
        text-align: center;
        transition: background-color 0.3s ease;
    }
    .caja:hover {
        background-color: #45a049;
    }
</style>
</head>
<body>

<div id="miDiv" class="caja" onclick="cargarPHP()">
    📄 Haz clic para cargar contenido
</div>

<script>
function cargarPHP() {
    const div = document.getElementById('miDiv');
    div.innerHTML = "⏳ Cargando...";

    fetch('contenido.php') // Archivo PHP que devolverá HTML o texto
        .then(response => {
            if (!response.ok) throw new Error("Error al cargar el archivo");
            return response.text();
        })
        .then(data => {
            div.innerHTML = data; // Insertar el contenido del PHP en el DIV
        })
        .catch(error => {
            div.innerHTML = "❌ Error: " + error.message;
        });
}
</script>

</body>
</html>


contenido.php
Php<?php
// Simulación de datos dinámicos
$fecha = date("d/m/Y H:i:s");
echo "<strong>Hola desde PHP</strong><br>Fecha y hora del servidor: $fecha";
?>


🔹 Cómo funciona:

El <div> tiene un onclick que llama a cargarPHP().
La función usa fetch() para pedir el archivo contenido.php.
El contenido que devuelve el PHP se inserta directamente dentro del <div>.
No hay recarga de página, todo es dinámico.


Si quieres, puedo mejorarlo para que el mismo div pueda volver a su estado inicial y recargar el PHP cada vez que se pulse.
¿Quieres que lo prepare así para que sea interactivo al 100%?



Perfecto 👍
Aquí te dejo la versión mejorada e interactiva:

El <div> funciona como un botón.
Al hacer clic, carga el contenido del PHP.
Si vuelves a hacer clic, regresa al estado inicial y puedes volver a cargarlo.


HTML + CSS + JS
Html<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>DIV interactivo que carga PHP</title>
<style>
    .caja {
        width: 280px;
        min-height: 100px;
        background-color: #4CAF50;
        color: white;
        display: flex;
        align-items: center;
        justify-content: center;
        cursor: pointer;
        border-radius: 8px;
        font-size: 18px;
        text-align: center;
        padding: 10px;
        transition: background-color 0.3s ease;
        user-select: none;
    }
    .caja:hover {
        background-color: #45a049;
    }
</style>
</head>
<body>

<div id="miDiv" class="caja">
    📄 Haz clic para cargar contenido
</div>

<script>
let mostrandoContenido = false; // Estado del div

document.getElementById('miDiv').addEventListener('click', function() {
    const div = this;

    if (!mostrandoContenido) {
        // Estado: mostrar contenido PHP
        div.innerHTML = "⏳ Cargando...";
        fetch('contenido.php')
            .then(response => {
                if (!response.ok) throw new Error("Error al cargar el archivo");
                return response.text();
            })
            .then(data => {
                div.innerHTML = data + "<br><br>🔄 Haz clic para volver";
                mostrandoContenido = true;
            })
            .catch(error => {
                div.innerHTML = "❌ Error: " + error.message;
            });
    } else {
        // Estado: volver al mensaje inicial
        div.innerHTML = "📄 Haz clic para cargar contenido";
        mostrandoContenido = false;
    }
});
</script>

</body>
</html>


contenido.php
Php<?php
// Simulación de datos dinámicos
$fecha = date("d/m/Y H:i:s");
$mensaje = [
    "Hola desde PHP 👋",
    "Contenido cargado dinámicamente ✅",
    "Fecha y hora del servidor: $fecha"
];

// Devolver como HTML
echo "<strong>{$mensaje[0]}</strong><br>{$mensaje[1]}<br>{$mensaje[2]}";
?>


🔹 Funcionamiento:

Primer clic → Muestra "⏳ Cargando..." y luego el contenido del PHP.
Segundo clic → Vuelve al mensaje inicial.
Puedes repetir el proceso todas las veces que quieras.
Todo se hace sin recargar la página.


Si quieres, puedo hacer que este mismo div cargue diferentes archivos PHP según el clic (por ejemplo, rotando entre varios contenidos).
Eso sería útil si quieres mostrar varias secciones dinámicas en un solo espacio.
¿Quieres que te lo prepare así para que sea un mini-visor de PHP?



Perfecto 🚀
Vamos a crear un mini visor dinámico donde el mismo <div> va cambiando de contenido cada vez que lo pulses, cargando diferentes archivos PHP de forma cíclica, sin recargar la página.

HTML + CSS + JS
Html<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Mini visor de PHP en un DIV</title>
<style>
    .caja {
        width: 300px;
        min-height: 120px;
        background-color: #4CAF50;
        color: white;
        display: flex;
        align-items: center;
        justify-content: center;
        cursor: pointer;
        border-radius: 8px;
        font-size: 18px;
        text-align: center;
        padding: 10px;
        transition: background-color 0.3s ease;
        user-select: none;
    }
    .caja:hover {
        background-color: #45a049;
    }
</style>
</head>
<body>

<div id="miDiv" class="caja">
    📄 Haz clic para ver contenido
</div>

<script>
// Lista de archivos PHP que se irán mostrando
const archivosPHP = [
    'contenido1.php',
    'contenido2.php',
    'contenido3.php'
];

let indice = 0; // Índice actual

document.getElementById('miDiv').addEventListener('click', function() {
    const div = this;
    div.innerHTML = "⏳ Cargando...";

    fetch(archivosPHP[indice])
        .then(response => {
            if (!response.ok) throw new Error("Error al cargar el archivo");
            return response.text();
        })
        .then(data => {
            div.innerHTML = data + "<br><br>🔄 Clic para siguiente";
            indice = (indice + 1) % archivosPHP.length; // Avanzar al siguiente archivo
        })
        .catch(error => {
            div.innerHTML = "❌ Error: " + error.message;
        });
});
</script>

</body>
</html>


contenido1.php
Php<?php
echo "<strong>📌 Contenido 1</strong><br>Hola desde el primer archivo PHP.<br>Fecha: " . date("d/m/Y H:i:s");
?>

contenido2.php
Php<?php
echo "<strong>📌 Contenido 2</strong><br>Este es el segundo archivo PHP.<br>Servidor: " . $_SERVER['SERVER_NAME'];
?>

contenido3.php
Php<?php
$random = rand(1, 100);
echo "<strong>📌 Contenido 3</strong><br>Número aleatorio generado: $random";
?>


🔹 Funcionamiento:

Primer clic → Carga contenido1.php.
Segundo clic → Carga contenido2.php.
Tercer clic → Carga contenido3.php.
Cuarto clic → Vuelve a contenido1.php y así sucesivamente.
Todo es dinámico y sin recargar la página.


Si quieres, puedo hacer que este visor cambie automáticamente cada X segundos sin necesidad de hacer clic, pero que también permita avanzar manualmente.
Eso lo convertiría en un slider automático de contenido PHP.
¿Quieres que lo prepare así?



Perfecto 😎
Vamos a crear un visor automático de contenido PHP que:

Cambia de archivo PHP cada X segundos automáticamente.
Permite avanzar manualmente haciendo clic en el <div>.
Todo sin recargar la página.


HTML + CSS + JS
Html<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Slider automático de PHP</title>
<style>
    .caja {
        width: 320px;
        min-height: 120px;
        background-color: #4CAF50;
        color: white;
        display: flex;
        align-items: center;
        justify-content: center;
        cursor: pointer;
        border-radius: 8px;
        font-size: 18px;
        text-align: center;
        padding: 10px;
        transition: background-color 0.3s ease;
        user-select: none;
    }
    .caja:hover {
        background-color: #45a049;
    }
</style>
</head>
<body>

<div id="miDiv" class="caja">
    📄 Cargando contenido...
</div>

<script>
// Lista de archivos PHP
const archivosPHP = [
    'contenido1.php',
    'contenido2.php',
    'contenido3.php'
];

let indice = 0;
let intervalo = null;
const div = document.getElementById('miDiv');

// Función para cargar un archivo PHP en el DIV
function cargarContenido() {
    div.innerHTML = "⏳ Cargando...";
    fetch(archivosPHP[indice])
        .then(response => {
            if (!response.ok) throw new Error("Error al cargar el archivo");
            return response.text();
        })
        .then(data => {
            div.innerHTML = data + "<br><br>🔄 Clic para siguiente";
            indice = (indice + 1) % archivosPHP.length;
        })
        .catch(error => {
            div.innerHTML = "❌ Error: " + error.message;
        });
}

// Avanzar manualmente con clic
div.addEventListener('click', () => {
    cargarContenido();
    reiniciarIntervalo();
});

// Cambiar automáticamente cada 5 segundos
function iniciarIntervalo() {
    intervalo = setInterval(cargarContenido, 5000);
}

// Reiniciar el temporizador cuando el usuario hace clic
function reiniciarIntervalo() {
    clearInterval(intervalo);
    iniciarIntervalo();
}

// Iniciar
cargarContenido();
iniciarIntervalo();
</script>

</body>
</html>


contenido1.php
Php<?php
echo "<strong>📌 Contenido 1</strong><br>Hola desde el primer archivo PHP.<br>Fecha: " . date("d/m/Y H:i:s");
?>

contenido2.php
Php<?php
echo "<strong>📌 Contenido 2</strong><br>Este es el segundo archivo PHP.<br>Servidor: " . $_SERVER['SERVER_NAME'];
?>

contenido3.php
Php<?php
$random = rand(1, 100);
echo "<strong>📌 Contenido 3</strong><br>Número aleatorio generado: $random";
?>


🔹 Funcionamiento:

Automático → Cambia de contenido cada 5 segundos.
Manual → Si haces clic, avanza al siguiente inmediatamente y reinicia el temporizador.
Cíclico → Cuando llega al último archivo, vuelve al primero.
Sin recarga → Todo se hace con fetch() y JavaScript.


Si quieres, puedo mejorarlo para que el cambio automático tenga una animación de desvanecimiento (fade) y se vea más profesional.
¿Quieres que lo prepare con ese efecto visual?


Y me cierra con "Estamos trabajando duro para obtener tu respuesta. Vuelve a intentarlo más tarde."





Vuelvo al inicio y me quedo con esto para aplicarlo:
<div class="clickable" onclick="window.location.href='pagina.php'">



Si parto de esto...
                echo "<li class='sinfoto'><div onclick='detalle.php'><h2>
… entiendo que llego a this(esto):
                echo "<li class='sinfoto'><div onclick="window.location.href='detalle.php'"><h2>

128: pues va y no me quiere, entiendo que por el rollo de las comillas en esta línea:
                echo "<li class='sinfoto'><div onclick="window.location.href='detalle.php'"><h2><h2>" . $noticia['titulo'] . "</h2><p>" . $noticia['texto'] . "</p>  </div></li>";
… la sacaré del rango php, a ver qué tal:


Tras quitarle un <h2> me sigue fallando:
                echo "<li class='sinfoto'><div onclick="window.location.href='detalle.php'"><h2>" . $noticia['titulo'] . "</h2><p>" . $noticia['texto'] . "</p>  </div></li>";


Pues a reconvertir, lo dejo en:

?>
                <li class='sinfoto'>
                    <div onclick="window.location.href='detalle.php'">
                <?php
                echo "<h2>" . $noticia['titulo'] . "</h2><p>" . $noticia['texto'] . "</p>  </div></li>";


Se ve en 130 y ya no me da errores... A ver si funciona

131, 132: ok, funciona porque va, pero cuando llega me repite todo... debe ser algo del include


Busco en Google "php pasar variables de un archivo php a otro"

En PHP, puedes pasar variables de un archivo a otro de varias formas, dependiendo de si quieres enviarlas por URL, por formulario, mediante sesiones o incluyendo archivos.
Aquí te muestro las opciones más comunes con ejemplos completos y seguros:

1. Usando $_GET (por URL)
Se envían los datos como parámetros en la URL.
Ventaja: Fácil de implementar.
Desventaja: Visible en la barra de direcciones (no usar para datos sensibles).
archivo1.php
Php<?php
$nombre = "Juan";
$edad = 25;

// Redirigir con variables en la URL
header("Location: archivo2.php?nombre=" . urlencode($nombre) . "&edad=" . $edad);
exit;

archivo2.php
Php<?php
if (isset($_GET['nombre']) && isset($_GET['edad'])) {
    $nombre = $_GET['nombre'];
    $edad = (int) $_GET['edad'];

    echo "Nombre: " . htmlspecialchars($nombre) . "<br>";
    echo "Edad: " . $edad;
} else {
    echo "No se recibieron datos.";
}


2. Usando $_POST (formulario)
Se envían los datos ocultos en el cuerpo de la petición.
Ventaja: No se ven en la URL.
Desventaja: Necesita un formulario o petición POST.
archivo1.php
Php<form action="archivo2.php" method="post">
    <input type="hidden" name="nombre" value="Juan">
    <input type="hidden" name="edad" value="25">
    <button type="submit">Enviar</button>
</form>

archivo2.php
Php<?php
if (isset($_POST['nombre']) && isset($_POST['edad'])) {
    $nombre = $_POST['nombre'];
    $edad = (int) $_POST['edad'];

    echo "Nombre: " . htmlspecialchars($nombre) . "<br>";
    echo "Edad: " . $edad;
} else {
    echo "No se recibieron datos.";
}


3. Usando $_SESSION (recomendado para datos temporales)
Permite compartir variables entre páginas sin pasarlas por URL o formulario.
archivo1.php
Php<?php
session_start(); // Iniciar sesión
$_SESSION['nombre'] = "Juan";
$_SESSION['edad'] = 25;

header("Location: archivo2.php");
exit;

archivo2.php
Php<?php
session_start();
if (isset($_SESSION['nombre']) && isset($_SESSION['edad'])) {
    echo "Nombre: " . htmlspecialchars($_SESSION['nombre']) . "<br>";
    echo "Edad: " . $_SESSION['edad'];
} else {
    echo "No hay datos en la sesión.";
}


4. Usando include o require
Si solo quieres compartir variables en tiempo de ejecución dentro del mismo flujo.
variables.php
Php<?php
$nombre = "Juan";
$edad = 25;

archivo1.php
Php<?php
include 'variables.php';
echo "Nombre: $nombre, Edad: $edad";


✅ Recomendación:

Usa $_SESSION para datos temporales entre páginas.
Usa $_POST para formularios y datos sensibles.
Usa $_GET solo para datos no sensibles y navegación.


Si quieres, puedo prepararte un ejemplo práctico que combine $_SESSION y $_POST para pasar datos de forma segura entre varias páginas.
¿Quieres que te lo prepare?



En PHP, la función header() se utiliza para enviar encabezados HTTP al navegador antes de que se envíe cualquier salida de contenido.
Cuando se usa con "Location:", sirve para redireccionar al usuario a otra URL.

Sintaxis básica
Phpheader("Location: https://ejemplo.com");
exit; // Muy recomendable para detener la ejecución del script


Cómo funciona

header("Location: ...") envía al navegador un encabezado HTTP de tipo Location.
Esto indica al navegador que debe cargar otra página.
Por defecto, PHP envía un código de estado 302 (Found), que es una redirección temporal.
Puedes especificar otro código de estado, por ejemplo:

Phpheader("Location: /nueva-pagina.php", true, 301); // Redirección permanente
exit;


Reglas importantes

No debe haberse enviado salida antes (ni espacios, ni texto, ni HTML), porque los encabezados HTTP se envían antes del contenido.
Siempre es buena práctica usar exit; después para evitar que el script siga ejecutándose.
Puedes usar rutas absolutas (https://...) o relativas (/ruta/...).


Ejemplo práctico
Php<?php
// Redirigir a otra página si el usuario no está autenticado
session_start();

if (!isset($_SESSION['usuario'])) {
    header("Location: login.php");
    exit;
}

echo "Bienvenido, " . $_SESSION['usuario'];
?>


✅ En resumen:
header("Location: ...") en PHP es una forma de redirigir al navegador a otra URL enviando un encabezado HTTP antes de que se genere cualquier salida.

Si quieres, puedo prepararte un ejemplo seguro de redirección con validación de URL para evitar vulnerabilidades como Open Redirect.
¿Quieres que te lo incluya?


147, 148: si anulo el include pierdo los valores de las variables... me temo que tendría que usar una function, dentro de la cual usaría eso de val();


Busco en Google "javascript mostrar información de un array"

Aquí tienes un ejemplo completo y robusto en JavaScript para mostrar la información de un array, tanto si es un array simple como si es un array de objetos.

Ejemplo 1: Array simple
Javascript// Array simple
const numeros = [10, 20, 30, 40, 50];

// Mostrar todos los elementos
console.log("Array completo:", numeros);

// Recorrer y mostrar cada elemento con su índice
numeros.forEach((valor, indice) => {
    console.log(`Índice ${indice}: ${valor}`);
});


Ejemplo 2: Array de objetos
Javascript// Array de objetos
const personas = [
    { nombre: "Ana", edad: 25 },
    { nombre: "Luis", edad: 30 },
    { nombre: "María", edad: 28 }
];

// Mostrar el array completo en formato tabla
console.table(personas);

// Recorrer y mostrar cada propiedad
personas.forEach((persona, i) => {
    console.log(`Persona ${i + 1}: Nombre=${persona.nombre}, Edad=${persona.edad}`);
});


Ejemplo 3: Mostrar en HTML (navegador)
Html<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Mostrar Array</title>
</head>
<body>
    <ul id="lista"></ul>

    <script>
        const frutas = ["Manzana", "Banana", "Cereza"];
        const lista = document.getElementById("lista");

        frutas.forEach(fruta => {
            const li = document.createElement("li");
            li.textContent = fruta;
            lista.appendChild(li);
        });
    </script>
</body>
</html>


✅ Notas importantes:

console.log() muestra el array tal cual.
console.table() es muy útil para arrays de objetos, ya que los presenta en formato de tabla.
forEach() permite recorrer el array y acceder a cada elemento y su índice.
En HTML, puedes usar document.createElement() para mostrar datos en la página.


Si quieres, puedo prepararte una versión que muestre cualquier array (simple o de objetos) de forma automática y formateada para consola o HTML.
¿Quieres que te la haga?



150: y cierto, me queda dirigir el evento hacia las noticias con foto


ESTADO FINAL DE AMBOS ARCHIVOS:

INDEX.PHP:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Noticias</title>

    <link rel="stylesheet" href="https://code.jquery.com/ui/1.14.2/themes/base/jquery-ui.css">

    <script src="https://code.jquery.com/jquery-3.7.1.js"></script>
    <script src="https://code.jquery.com/ui/1.14.2/jquery-ui.js"></script>
    <script>
        function modal(key) {
            /*             $.get("includes/noticia.php?key=" + key, function(data) { */
            $.get($noticia['noticia'], function(data) {
                $("#dialog-message").html(data);
            });
            let alturaventana = $(window).height() * 0.8;
            let anchoventana = $(window).width() * 0.95;
            $("#dialog-message").dialog({
                modal: true,
                /*                 position: {
                                    my: "top",
                                    at: "center",
                                    of: "header"
                                }, */
                height: alturaventana,
                width: anchoventana,
                buttons: {
                    Cerrar: function() {
                        $(this).dialog("close");
                    }
                }
            });
        }
    </script>



    <link rel="stylesheet" href="style.css">
</head>

<body>

    <main>
        <h1>Noticias Portada</h1>
        <?php

        /*  include_once('includes/datos.php'); */

        $json = file_get_contents("noticias.json");
        $resultado = json_decode($json, true);

        echo "<ul class='listados'>";
        foreach ($resultado as $index => $noticia) {
            if ($noticia['img'] != "") {
                echo "<li class='confoto'><div><img src='{$noticia['img']}' alt='Imagen noticia'></div><div onclick='modal({$noticia['id']})'><h2>" . $noticia['titulo'] . "</h2><p>" . $noticia['texto'] . "</p>  </div></li>";
            } else {
        ?>
                <li class='sinfoto'>
                    <div onclick="window.location.href='detalle.php'">
                <?php
                echo "<h2>" . $noticia['titulo'] . "</h2><p>" . $noticia['texto'] . "</p>  </div></li>";
            }
        }
                ?>
                </ul>


                <div id="dialog-message" title="Noticia completa">
                </div>
    </main>
</body>

</html>


DETALLE.PHP:
<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>


    <main>

        <?php

/*         include_once('index.php'); */

        echo "<h1>{$noticia['titulo']}</h1>";

        if ($noticia['img'] != "") {
            echo "<img src='{$noticia['img']}' alt='Imagen noticia'>";
        }

        echo "<p>" . $noticia['texto'] . "</p>";

        ?>


        <div id="dialog-message" title="Noticia completa">
        </div>
    </main>


<a href="index.php"> Volver a Noticias </a>


</body>

</html>


*** Día 17/02/2026

https://obsproject.com/es/download
https://obsproject.com/es/welcome


Tomar aire antes de que te metan algo en la boca en el otorrino

node js, js del lado del servidor
Hace falta un websocket
Las fichas son utf, van en onclick

Plataformas, generación del mundo en 3D

Diablo 2

El Kea derribado??

IBEX 35, media ponderada

J1, ajedrez y bolsa
J2 desde 10:27


11: un fetch es una petición ajax, es la función nativa de JS que hace peticiones a los servidores
47: los then son promesas,el data formará el json, si lo hace bien

En vez de enviar info por el lado del servidor lo hacen con un json que recogen por JS

22, 23: abierto en nueva pestaña

25, 26: cambiando el isin cambiamos de empresa

31: así tabula la información

Hasta 38 va borrando cosas para dejar los ISIN


57: da el error CORS porque la petición es desde otro dominio

64: al ejecutar llega una web

Ah, lo que no permitían eran peticiones JS, no era cosa del dominio

span es una etiqueta para texto sin que haga saltos de línea

89, 90: se pueden hacer peticiones desde consola, que no pertenecen a dominio

El problema de esta web es que tiene los json muy expuestos, eso no es bueno


100, 101: canvas es un lienzo blanco donde puedes pintar

Sobre 118: va recogiendo diferente código de estos gráficos

themoviedb.org


Si tenemos tablas de productos y categorías, es en la tabla de productos donde tengo que meter la relación


De buscar en Google "phpmyadmin campo booleano":

Para crear un campo booleano en phpMyAdmin (MySQL/MariaDB), utiliza el tipo de dato TINYINT(1). Aunque MySQL permite escribir BOOLEAN o BOOL, internamente lo convierte a TINYINT(1), donde 0 es falso (false) y 1 es verdadero (true). Se recomienda establecer una longitud de '1' y un valor predeterminado (default) de 0 o 1. 

Pasos para configurar un campo booleano en phpMyAdmin:
Estructura de la tabla: Ve a la pestaña "Estructura" de tu tabla.
Agregar columna: Selecciona el nombre del campo (ej. activo, es_admin).
Tipo de dato: Selecciona TINYINT.
Longitud/Valores: Escribe 1 (para limitar a 0 o 1).
Predeterminado (Default): Define 0 para falso o 1 para verdadero.
Guardar: Aplica los cambios. 

Ejemplo práctico
Nombre: activo
Tipo: TINYINT
Longitud: 1
Valor por defecto: 0 (Falso)

Uso en SQL/PHP
Insertar/Actualizar: UPDATE tabla SET activo = 1;
Consultar: SELECT * FROM tabla WHERE activo = 1; 


*** Día 18/02/2026

Token de acceso de lectura a la API
eyJhbGciOiJIUzI1NiJ9.eyJhdWQiOiIyNDZlNmJmMjE0MDZlMjQ3YWI5ZWYyODk3NDBmOTFiMyIsIm5iZiI6MTc3MTQwNzI0MC40NDYsInN1YiI6IjY5OTU4Nzg4ZWRmMTIzZDhjN2ZhNDUzZCIsInNjb3BlcyI6WyJhcGlfcmVhZCJdLCJ2ZXJzaW9uIjoxfQ.7EOvyuZSSOJqxdEJCE7UDdU0o3emSJgyzU4ReDqN50s

Clave de la API
246e6bf21406e247ab9ef289740f91b3

Documentación
Our primary documentation is located at developer.themoviedb.org.


https://www.themoviedb.org/settings/api

curl --request GET \
     --url 'https://api.themoviedb.org/3/movie/11' \
     --header 'Authorization: Bearer <<access_token>>'


https://www.themoviedb.org/authenticate/{REQUEST_TOKEN}
https://www.themoviedb.org/authenticate/eyJhbGciOiJIUzI1NiJ9.eyJhdWQiOiIyNDZlNmJmMjE0MDZlMjQ3YWI5ZWYyODk3NDBmOTFiMyIsIm5iZiI6MTc3MTQwNzI0MC40NDYsInN1YiI6IjY5OTU4Nzg4ZWRmMTIzZDhjN2ZhNDUzZCIsInNjb3BlcyI6WyJhcGlfcmVhZCJdLCJ2ZXJzaW9uIjoxfQ.7EOvyuZSSOJqxdEJCE7UDdU0o3emSJgyzU4ReDqN50s

<?php
$idempresa = $_GET['isin'];
$url = "https://apiweb.bolsasymercados.es/Market/v1/EQ/HistoricalSharesPrices?type=V&pageSize=0&ISIN=" . $idempresa;
$json = file_get_contents($url);
echo $json;
?>




function datosEmpresa() {
    var idempresa = document.getElementById("empresa").value;
    var url = "json.php?isin=" + idempresa;
    fetch(url)
        .then(response => response.json())
        .then(json => {
            //console.log(json);
            var precio = json.data[0].last;
            var media = json.data[0].average;
            var bajo = json.data[0].low;
            var alto = json.data[0].high;
            document.getElementById("precio").innerHTML = "Precio actual:<strong> " + precio + " €</strong>, Precio medio: <strong>" + media + " €</strong>, Precio bajo: <strong>" + bajo + " €</strong>, Precio alto: <strong>" + alto + " €</strong>";
        })
        .catch(error => console.error("Error al obtener los datos:", error));

    var url = "historial.php?isin=" + idempresa;
    fetch(url)
        .then(response => response.json())
        .then(json => {
            json.data.forEach(element => {
                datos.push(element.close);
                etiquetas.push(element.date);  
            });
            grafica();
        })
        .catch(error => console.error("Error al obtener los datos:", error));
}


API REST: son las más comunes. Usan protocolos HTTP


Desde 43:

<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://api.themoviedb.org/3/trending/movie/day?language=en-US",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJhdWQiOiIyNDZlNmJmMjE0MDZlMjQ3YWI5ZWYyODk3NDBmOTFiMyIsIm5iZiI6MTc3MTQwNzI0MC40NDYsInN1YiI6IjY5OTU4Nzg4ZWRmMTIzZDhjN2ZhNDUzZCIsInNjb3BlcyI6WyJhcGlfcmVhZCJdLCJ2ZXJzaW9uIjoxfQ.7EOvyuZSSOJqxdEJCE7UDdU0o3emSJgyzU4ReDqN50s",
    "accept: application/json"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}


Me lleva a 44 y veo la estructura
Usar en este caso file_get_contents($url); sobre la respuesta es peor
Llego a algo de este estilo:

{"page":1,"results":[{"adult":false,"backdrop_path":"/7HKpc11uQfxnw0Y8tRUYn1fsKqE.jpg","id":1236153,"title":"Mercy","original_title":"Mercy","overview":"In the near future, a detective stands on trial accused of murdering his wife. He has ninety minutes to prove his innocence to the advanced AI Judge he once championed, before it determines his fate.","poster_path":"/pyok1kZJCfyuFapYXzHcy7BLlQa.jpg","media_type":"movie","original_language":"en","genre_ids":[878,28,53],"popularity":275.8216,"release_date":"2026-01-20","video":false,"vote_average":6.745,"vote_count":186},{"adult":false,"backdrop_path":"/ryynYdXgP2vLZKH3154bLkNp1kx.jpg","id":1272837,"title":"28 Years Later: The Bone Temple","original_title":"28 Years Later: The Bone Temple","overview":"Dr. Kelson finds himself in a shocking new relationship - with consequences that could change the world as they know it - and Spike's encounter with Jimmy Crystal becomes a nightmare he can't escape.","poster_path":"/kK1BGkG3KAvWB0WMV1DfOx9yTMZ.jpg","media_type":"movie","original_language":"en","genre_ids":[27,53,878],"popularity":153.5347,"release_date":"2026-01-14","video":false,"vote_average":7.2,"vote_count":374},




foreach ($grid as $y => $row) {
    foreach ($row as $x => $value) {
        echo "Valor en posición x=$x y y=$y: $value\n";


<pre>
print_r($pelis);
</pre>

foreach ($pelis as $key => $a) {
        echo $pelis[4];
}



Partiendo del array que muestra https://arturo.avisando.com/php/cine/index.php, ¿cómo hacer un recorrido para que muestre todos los títulos?

Para recorrer **todos los títulos** de películas que aparecen en esa salida (https://arturo.avisando.com/php/cine/index.php), depende de en qué lenguaje estás trabajando, pero lo más común en este contexto es **PHP**, ya que la página muestra un `print_r` o `var_dump` típico de PHP.

Aquí te muestro las formas más habituales de hacerlo:

### 1. En PHP (la opción más lógica en este caso)

```php
<?php

// Opción A: Si ya tienes el array en una variable $datos
// (por ejemplo, después de json_decode o de la consulta original)

foreach ($datos['results'] as $pelicula) {
    echo $pelicula['title'] . "<br>";
}

// Opción B: Versión más completa y segura (recomendada)
foreach ($datos['results'] as $pelicula) {
    $titulo = $pelicula['title'] ?? 'Sin título';
    $año    = substr($pelicula['release_date'] ?? '----', 0, 4);
    
    echo htmlspecialchars($titulo) . " ($año)<br>";
}
```

### 2. Si estás consumiendo esa URL desde otro script (por ejemplo con file_get_contents + preg_match o similar)

Normalmente no es buena idea parsear `print_r`, pero si no tienes acceso al código original, una forma rápida sería:

```php
<?php

$url = "https://arturo.avisando.com/php/cine/index.php";
$html = file_get_contents($url);

// Esto es frágil, solo como ejemplo didáctico
preg_match_all('/\[title\]\s*=>\s*(.+?)(?=\n\s*\[|$)/s', $html, $coincidencias);

foreach ($coincidencias[1] as $titulo) {
    $titulo = trim($titulo);
    echo htmlspecialchars($titulo) . "<br>";
}
```

→ **Mucho mejor opción**: pedirle al dueño del sitio que devuelva **JSON** en vez de `print_r`

### 3. Si lo estás viendo desde JavaScript (por ejemplo en el navegador o Node.js)

```javascript
fetch('https://arturo.avisando.com/php/cine/index.php')
  .then(response => response.text())
  .then(texto => {
    // Opción fea pero funcional: parsear el texto (muy frágil)
    const titulos = texto.match(/\[title\]\s*=>\s*(.+?)(?=\n\s*\[|$)/gs)
      ?.map(t => t.replace(/\[title\]\s*=>\s*/, '').trim()) || [];
    
    titulos.forEach(titulo => console.log(titulo));
  });
```

### Recomendación realista y limpia

Lo ideal sería modificar el archivo `index.php` original para que devuelva JSON en lugar de `print_r` o `var_dump`. Así:

```php
<?php
header('Content-Type: application/json; charset=utf-8');

// ... tu código que genera $datos ...

echo json_encode($datos);
exit;
```

Y luego desde cualquier lenguaje lo consumirías así (ejemplo en PHP):

```php
$json = file_get_contents("https://arturo.avisando.com/php/cine/index.php");
$datos = json_decode($json, true);

foreach ($datos['results'] as $peli) {
    echo $peli['title'] . "\n";
}
```

O en JavaScript moderno:

```javascript
const respuesta = await fetch('https://arturo.avisando.com/php/cine/index.php');
const datos = await respuesta.json();

datos.results.forEach(peli => {
    console.log(peli.title);
});
```

¿En qué lenguaje estás intentando hacer el recorrido? ¿PHP, JavaScript, Python, otro? Dímelo y te doy la versión más cómoda para tu caso. 😄



57: https://marcos.avisando.com/apis/peliculas/detalle.php?id=1236153&tipo=movie



Es decir, que partiendo de:

Array
(
    [page] => 1
    [results] => Array
        (
            [0] => Array
                (
                    [adult] => 
                    [backdrop_path] => /7HKpc11uQfxnw0Y8tRUYn1fsKqE.jpg
                    [id] => 1236153
                    [title] => Mercy
...


no funciona esto:
foreach ($pelis as $key => $a) {
        echo $pelis[1][$a][3];
        echo $pelis[1][$a][5];
        echo $pelis[1][$a][6];
        echo $pelis[1][$a][3];
    } 

es mejor esto:
foreach ($pelis['results'] as $pelicula) {
        echo $pelicula['title'] . "<br>";
        echo $pelicula['overview'] . "<br>";
        echo $pelicula['poster_path'] . "<br>";
    }

Desde:
foreach ($datos['results'] as $pelicula) {
    echo $pelicula['title'] . "<br>";
}


Por cierto, el curl salió de:
https://developer.themoviedb.org/reference/authentication-how-do-i-generate-a-session-id

No funcionan cosas como estas:
    echo $pelis[1][2][3];
    echo $pelis[results][2][3];

Es decir, que entiendo que no puedes identificar al array como 0, 1, 2... si su key no se llama así. Ok
Sólo funciona este tipo de estructura, aquí la key 2 sí existe (se puede ver en 49), no sólo identifica la posición
    echo $pelis['results'][2]['title'];


*** Día 19/02/2026

ESTADO INICIAL:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title> Cine bro </title>
</head>

<body>

    <?php


    $curl = curl_init();

    curl_setopt_array($curl, [
        CURLOPT_URL => "https://api.themoviedb.org/3/trending/movie/day?language=en-US",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "GET",
        CURLOPT_HTTPHEADER => [
            "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJhdWQiOiIyNDZlNmJmMjE0MDZlMjQ3YWI5ZWYyODk3NDBmOTFiMyIsIm5iZiI6MTc3MTQwNzI0MC40NDYsInN1YiI6IjY5OTU4Nzg4ZWRmMTIzZDhjN2ZhNDUzZCIsInNjb3BlcyI6WyJhcGlfcmVhZCJdLCJ2ZXJzaW9uIjoxfQ.7EOvyuZSSOJqxdEJCE7UDdU0o3emSJgyzU4ReDqN50s",
            "accept: application/json"
        ],
    ]);

    $response = curl_exec($curl);
    $err = curl_error($curl);

    curl_close($curl);

    if ($err) {
        echo "cURL Error #:" . $err;
        /* } else {
        echo $response; */
    }

    $pelis = json_decode($response, true);


    /* echo "<pre>";
    print_r($pelis);
    echo "</pre>"; */



    /*     foreach ($pelis as $key => $a) {
        echo $pelis[1][$a][3];
        echo $pelis[1][$a][5];
        echo $pelis[1][$a][6];
        echo $pelis[1][$a][3];
    } */

    foreach ($pelis['results'] as $pelicula) {
        echo $pelicula['title'] . "<br>";
        echo $pelicula['overview'] . "<br>";
        echo $pelicula['poster_path'] . "<br>";
    }






    ?>



</body>

</html>


17: pero parece que los idiomas de 14 no me funcionan. Ah, espera, que no lo había grabado
... pero grabo y sigue igual


Encuentro error en:
       <img src=<?php"https://www.themoviedb.org". $pelicula['poster_path']?> alt="Descripción">;

21: grok me dice que la forma correcta y más usada para mostrar el póster de una película de The Movie Database (TMDB) en PHP + HTML es la siguiente:

<img src="https://image.tmdb.org/t/p/w500<?php echo $pelicula['poster_path']; ?>" alt="Portada de <?php echo htmlspecialchars($pelicula['title'] ?? 'película'); ?>">

Con lo cual mi teoría se convierte en esto:

       <img src="https://www.themoviedb.org<?php echo $pelicula['poster_path'];?>">

22, 23: ok, la expresión es correcta pero la ruta no... Intentaremos con la propuesta de grok... más tarde, porque 24

Desde 25 nos muestra la API de Google Maps, por el juego Openguessr


Las peticiones del API llegan al endpoint


Respecto al tema de la traducción, iba incorporada en la API, habría que volver otra vez a la documentación.

Respecto a lo que me dijo grok, de los cuatro ítems siguientes dos eran clases y los dos últimos psudoclases:

   .texto-en {
        display: none;
    }

    .texto-es {
        display: block;
    }

    :lang(es) .texto-en {
        display: none;
    }

    :lang(es) .texto-es {
        display: block;
    }


Las psudoclases sirven para atacar a lo que en el div tengamos definido con lang="en" y lang="es". Es decir, algo así:

    <div lang="en">aklsdfljasd</div>
    <div lang="es">oiuoiuo</div>


Webs utilizadas:
https://www.themoviedb.org/
https://www.themoviedb.org/settings/api
https://developer.themoviedb.org/reference/trending-movies, donde estaba el cURL
https://developer.themoviedb.org/reference/authentication-how-do-i-generate-a-session-id, creo que era donde estaban las "tendencias" a la izquierda
60: https://www.themoviedb.org/movie/now-playing
https://arturo.avisando.com/php/cine/index.php
61: https://grok.com/c/4e347b07-6f46-4d4d-a505-322d20a67956?rid=d94914ec-8e50-4226-8743-1976c91d8075
https://marcos.avisando.com/apis/peliculas/detalle.php?id=1236153&tipo=movie
63, donde paré: https://grok.com/c/79e61fb3-e762-448a-bb25-4221fabad9dc?rid=008bb155-25e5-45d7-800d-1de2aa9d0de0


Python va del lado del servidor


EJERCICIO:

Mejor para móvil, con un icono favicon
Select de 1, 5, 10 km
Al lado otra select con diesel, gasolina, gas, propano
Debajo un mapa (gratuito) de las gasolineras más baratas en el rango indicado, con geoposicionamiento de dónde estamos en el centro
Debajo el detalle de las gasolineras del mapa, con el precio, comenzando por la más barata
Si queremos, que al pinchar sobre la gasolinera nos enlace con google maps

Información publicada por el ministerio de Industria

Guardar en php/gasofa


*** Día 20/02/2026


1: chrome://whats-new/

Mejor para móvil, con un icono favicon
Select de 1, 5, 10 km
Al lado otra select con diesel, gasolina, gas, propano
Debajo un mapa (gratuito) de las gasolineras más baratas en el rango indicado, con geoposicionamiento de dónde estamos en el centro
Debajo el detalle de las gasolineras del mapa, con el precio, comenzando por la más barata
Si queremos, que al pinchar sobre la gasolinera nos enlace con google maps

Información publicada por el ministerio de Industria

Guardar en php/gasofa

2: https://leafletjs.com/

6: https://sede.serviciosmin.gob.es/es-es/datosabiertos/catalogo/precios-carburantes
El JSON está en https://sedeaplicaciones.minetur.gob.es/ServiciosRESTCarburantes/PreciosCarburantes/EstacionesTerrestres/


curl para aplicar el json de Precio de carburantes en las gasolineras españolas: Servicio REST

Hasta 13: busco lo anterior en Google y me lleva a https://datos.gob.es/es/catalogo/e05068001-precio-de-carburantes-en-las-gasolineras-espanolas, que me saca el mismo JSON de 6, pero sin más información que la que me da la IA de Google, que me lleva a...

14: la IA está mal, A y B me los saca igual...

curl -X GET "https://sedeaplicaciones.minetur.gob.es" -H "accept: application/json"
curl -X GET "https://sedeaplicaciones.minetur.gob.es" -H "accept: application/json"

16: le pido a grok "Dame el código PHP que incluya curl -X GET "https://sedeaplicaciones.minetur.gob.es" -H "accept: application/json" y me convierta el resultado en un array"
... pero el código resultante me da error, grok me pregunta por el endpoint...

19: le contesto con 
https://sedeaplicaciones.minetur.gob.es/ServiciosRESTCarburantes/PreciosCarburantes/EstacionesTerrestres/ y al menos algo me ofrece, sí

23: error 406 inicial
25: no entiendo por qué me saca todo el archivo sin más, la verdad... pero lo importante es que me muestra información, ese es el punto

Me monto un formulario inicial con dos select, a partir de lo que recojo de otro archivo... ya sólo me queda insertar el mapa. Insertar el mapa y luego fusionarlo todo


Hasta 36 voy probando con el mapa, en https://arturo.avisando.com/php/gasofa/index.php

43: como veo que sigue fallando probaré con esto, particularmente la línea 16

44: Diferencia con %: Mientras que height: 100% depende del tamaño del elemento padre, 100vh siempre se refiere a la altura de la ventana del navegador.

46: recursos web utilizados hasta ahora:
https://grok.com/c/cfeda3b0-1bf7-44e3-9aa1-6cd38bdf86aa?rid=1d3ac54f-bdd1-4824-951f-e310225831d5, para los datos
https://grok.com/c/d1702bba-2ea2-4350-9fa4-35ab6fc154d9?rid=6a3fa175-a5f2-4816-93db-7a2404a34d46, para el mapa
https://es.stackoverflow.com/questions/101638/css-el-height-100vh-no-funciona-correctamente, por lo del tamaño

47: cambiar la línea 39 no nos ha llevado a nada

49: con la última propuesta de grok ya sale mejor, por lo que fuera no la había usado hasta ahora... Saca el mapa centrado en la franja, pero no sale completo, sale entrecortado... me ocuparé de ello más tarde

Hablando con grok sobre geolocalización:
https://grok.com/c/d1702bba-2ea2-4350-9fa4-35ab6fc154d9?rid=c9d17ccf-fe22-433b-806b-53ef49463006

52 me lleva a 53. Es decir, no me saca nada... No sé si porque esta última propuesta es sólo de añadido y no de reemplazar totalmente...
Sí, será reemplazar lo de 56 con 57


*** Día 23/02/2026

Desde 12: Enlace suave, para proporcionar a otros usuarios enlace a la aplicación, mediante el comando ln
Intenta configurar el enlace pero le da problemas de permisos que va revisando desde debian
38: Al hacer un ls aparece un listado con los permisos (en letras), los usuarios, el grupo de usuarios al que pertenecen...

Cada nuevo usuario, con el enlace suave, tendrá su propia base de datos de la aplicación, y los cambios en la aplicación llegan a todos los usuarios sólo por el enlace suave

… hasta 50 intenta conseguirlo. Ve que tiene permisos pero luego le deniega el proceso... lo revisará

Este proceso hecho mediante la terminal de Debian se podría hacer en Windows mediante la terminal de VS Code


*** Día 23/02/20226 b

8: un alias es un servidor con 2 nombres

12: lo marcado son los certificados

13: va por el puerto 80 no seguro, y la última línea lo redirecciona a seguro

19: exporta en un lado e importa en el otro, y en 20 trunca para vaciar las bbdd

22 y 23 son lo mismo, aunque 24 le parece mejor

Lo ideal sería partir de una bdd sin datos (como el EMP000) pero con las tablas generales para adaptar después a cada empresa

29 a 32: crearíamos un fichero con las sentencias sql para crear y actualizar en el futuro. La idea además es aplicar esas sentencias mediante un script, cuando ya las tengamos probadas en una bdd de prueba nuestra. El script aplicará el cambio a todas las bbdd

(Y mira, en Sage estaba lo del versione.dbf para saber de dónde a dónde ir... aunque tampoco daba errores si lo cambiabas)

43: creada la bdd hacemos la importación del scirpt que lleva la bdd

Esto ya no es enlace suave, es otra estrategia

53: no funciona porque no hay index

55: aridoslaportina es el nombre de la bdd… y ya va (56)

Hasta 68 ha creado una plantilla desde el fichero sql y ha probado su importación en una bdd "nueva" (la anterior con las tablas borradas)

Para conservar la información podríamos hacer snapshots o backups (hasta 75)

76: puedes pasarlo de clouding a otro, siempre que uses virtualmin en ambos

84: los alias como flm no serían necesarios

96: se ha creado un backup, también se puede programar

99, 100: errores porque ha eliminado la carpeta de empleados y movido los ficheros a la raíz, parece ser que para hacer la aplicación más multiempresa... en 101 ya va

Después pasamos a añadir diferentes logos, por eso de tenerlo multiempresa

110: lo coge cuando mete las instrucciones CSS en el style propio del index (entiendo que estos style tienen más poder que un fichero CSS aparte)

113 a 115: el cambio de logo es automático, al cambiar de URL arriba

Desde 121: personalizando con los colores de las empresas

131, 132: cada empresa tiene sus propios estilos, a partir del fichero base de estilo (133)… Hasta 138: podemos dejar el fichero base y en los de empresa meter sólo lo que cambia

141 es sólo un módulo, no el curso completo

Python es fácil de aprender, y tiene un ecosistema muy grande, tiene muchas librerías... pero todavía los que más se usan son JS, Java, PHP
C++ es más difícil, pero los otros lenguajes se basan en él. C++ hace cosas que los demás hacen por debajo, C++ te sirve para ver la trastienda de los otros lenguajes


*** Día 24/02/2026

11: pues no, el cambio que propone grok no me funciona

http://datos.gob.es/

21: ah, ok, tengo que equilibrar width y height para que no se distorsione... pero no encuentro esa parte en mi código

Programación orientada a objetos (POO)... página 102 del libro

Los seres humanos tenemos propiedades (cosas que podemos hacer, características que tenemos)
Podemos tener un array de objetos de tipo humano

33: las clases tienen propiedades y métodos, que son variables y funciones
La clase es la plantilla del objeto

36: this es un puntero

37: p1 es un objeto de tipo persona

Sólo se puede acceder desde fuera a información pública

41: lo privado no se puede recoger desde fuera, por eso saca la parte roja en las líneas 22 y 28

44: es un array de objetos

51: al ser privado ya no deja acceder al nombre desde aquí, sólo desde 50-49

Constructores y destructores, para crear y eliminar objetos

53, dato protegido: no se puede acceder desde fuera, pero sí desde otra clase

Si no se pone nada, por defecto es público

54: extends... extiende significa que hereda de otra clase

https://www.php.net/manual/es/language.oop5.visibility.php

59 salía del foreach de 62

66: asiento no vendido es 0


Ejercicio:
Clase coche con propiedades:
color
marca
modelo
km
combustible
precio

Y luego definir, comprar y vender coches
Cuántos coches tenemos
Media de precios
Color más vendido


Desde dentro siempre hay que acceder con el $this


EJERCICIO:
Formulario para meter los datos del objeto
Listado por matrícula
Que podamos cambiar el precio y eliminarlo, una vez vendido

Serializar, filegetcontents, fileputcontents


https://grok.com/c/61839d9b-8140-47df-932a-022915836719?rid=ec1ba83c-01dd-4fd6-b32c-9b84e8cf3a3d


*** Día 25/02/2026

ESTADO INICIAL de ayer:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Cochecicos</title>
</head>

<body>

    <?php

    class coche
    {
        public $matricula;
        public $color;
        public $marca;
        public $modelo;
        public $kms;
        public $combustible;
        public $precio;
    }

    $coches = [];
    $coches[0] = new coche();
    $coches[0]->matricula = "8888";
    $coches[0]->color = "verde";
    $coches[0]->marca = "Opel";
    $coches[0]->modelo = "Corsa";
    $coches[0]->kms = 27;
    $coches[0]->combustible = "Eléctrico";
    $coches[0]->precio = 12000;

    $coches = new coche("7777", "azul", "Ford", "Fiesta", 40, "Diesel", 6000);


    $num = 0;
    $total = 0;

    foreach ($coches as $uno) {
        $num++;
        //        $total = $uno->precio++;
        $total = $uno['precio'];
    }

    echo "<br>En estos momentos hay {$num} coches";
    echo "<br>Precio medio del grupo" . $total / $num;
    echo "<br>Color más vendido: el que no está porque ya se lo han llevado";



    ?>



</body>

</html>


Nos lleva a 7 errores como este:

Warning: Trying to access array offset on value of type null in /home/arturo/public_html/php/oop/index.php on line 44

La línea 44 es la de $total = $uno['precio'];

La cambio a $total += $uno->precio; como me dijo grok y...
Warning: Attempt to read property "precio" on null in /home/arturo/public_html/php/oop/index.php on line 44


EJERCICIO:
Formulario para meter los datos del objeto
Listado por matrícula
Que podamos cambiar el precio y eliminarlo, una vez vendido


Es aconsejable tener una librería de clases

21: __construct es la función constructora

23 es la forma más segura y habitual de acceder a las propiedades de la clase

34 y 35: valores por defecto

39: mejor manejar em que pixels

43 al igualar los guiones de la clase del CSS

50: si se pide nuevo.php por url sale la web en blanco, su contenido es volátil... hay que serializar para guardar la información

55: formato serializado

58, 59: si no nos crea un array vacío, es como un if

Tenemos un array de objetos de tipo coche (en php los objetos podrían ser de diferente tipo, en java no)

72: tienen mucho padding

73: unset borra una variable de la memoria... 74: se mantienen las keys

En este caso necesitamos funciones para acceder a las propiedades, porque son privadas


Añadir y eliminar autobuses
Matrícula
Asientos

Añadir y eliminar rutas
Propiedades:
Nombre
Bus/buses
Precio
Funciones:
Vender asientos
Estado (completo o no)


94: inicio el proceso con el formulario y la creación de las clases, y después hago la function de MostrarRutas() basado en 27, pero me lo subraya como erróneo. Vuelvo a fijarme en 27...
... y efectivamente, en 95 se ve que metida la función dentro de la definición de clase ya no me da error el this.
(Duda: ok, pero hay que revisar el powerpoint porque me suena que hemos tenido functions en otros ficheros, fuera de la definición de clase... o a lo mejor eso ocurrió otro día, no sé)


Claude: IA para PHP


*** Día 26/02/2026

2: en el ejercicio anterior tenía los errores "Warning: Attempt to read property "precio" on null in /home/arturo/public_html/php/oop/index.php on line 44"
Era porque tenía un $coches = new coche("7777", "azul", "Ford", "Fiesta", 40, "Diesel", 6000); que machacaba el anterior objeto coche y le quitaba la categoría de array.

Además para usar la estructura $coches[] = new coche("7777", "azul", "Ford", "Fiesta", 40, "Diesel", 6000); necesito tener una función constructora (si no la tengo me daría error), para la primera forma no

        function __construct($matricula, $color, $marca, $modelo, $kms, $combustible, $precio)
        {
            $this->matricula = $matricula;
            $this->color = $color;
            $this->marca = $marca;
            $this->modelo = $modelo;
            $this->kms = $kms;
            $this->combustible = $combustible;
            $this->precio = $precio;
        }


3: y efectivamente funciona

Además ahora me dice que hay 2 coches, antes me decía que había 7... Entiendo que era por lo de $coches = new coche("7777", "azul", "Ford", "Fiesta", 40, "Diesel", 6000);

4: aquí no nos admite la sobrecarga. Es decir, no nos admite dos function __construct, da el error de 5, Fatal error: Cannot redeclare coche::__construct() in /home/arturo/public_html/php/oop/index.php on line 35. Si nos admitiera sobrecarga podríamos tener dos function __construct, la que tengo y otra sin parámetros, y que según llamara a la función usara una u otra.

Claro que también podemos usar la estructura function __construct($matricula = "",... y así ya podría definir cada objeto coche con las propiedades individualizadas como hacía antes en la primera definición, en el primer coche


Ejercicio presente, ESTADO INICIAL:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Reservas bus</title>
</head>

<body>

    <?php

    class bus
    {
        public $matricula;
        public $asientos;
    }


    class ruta
    {
        public $nombre;
        public $precio;
        public $bus;


        function MostrarRutas()
        {
            echo "Ruta: " . $this->nombre . " Precio asiento: " . $this->precio . " Modelo bus: (Pendiente) ";
        }
    }


    ?>



    <form action="index.php" method="post">
        <select name="proceso">
            <option value="rutas">Gestión de rutas</option>
            <option value="buses">Gestión de autobuses</option>
            <option value="reservas" selected>Reserva de asientos</option>
            <input type="submit" value="Enviar">
        </select>
    </form>

    <?php

    if (isset($_POST['proceso'])) {

        $proceso = $_POST['proceso'];
        if ($proceso == "rutas") {
            $ruta->MostrarRutas();
    ?>
            <form action="index.php" method="post">
                <input type="text" name="nomruta">
                <input type="number" name="prruta">
                <input type="text" name="busruta">
                <input type="submit" value="Enviar">
            </form>

    <?php
            if ((isset($_POST['nomruta'])) &&  (isset($_POST['prruta'])) &&  (isset($_POST['busruta']))) {

                $nuevaruta = new ruta($_POST['nomruta'], $_POST['prruta'], $_POST['busruta']);
                $rutas[] = $nuevaruta;
                $rutas[0]->MostrarRutas();
            }
        }

        if ($proceso == "buses") {
  
  
  
        }

        if ($proceso == "reservas") {
        }
    }

    ?>

</body>

</html>


13: me salen estos errores por el código de 14:

Warning: Undefined variable $ruta in /home/arturo/public_html/php/oop/1/index.php on line 54

Fatal error: Uncaught Error: Call to a member function MostrarRutas() on null in /home/arturo/public_html/php/oop/1/index.php:54 Stack trace: #0 {main} thrown in /home/arturo/public_html/php/oop/1/index.php on line 54


17: contradicciones entre $ruta y $rutas... hay que mejorarlo

18, lo corrijo en 19. Al menos así no me da error el VSCode... es como el 51 de ayer

20, llego a esatos errores:
Warning: Undefined array key 0 in /home/arturo/public_html/php/oop/1/index.php on line 56

Fatal error: Uncaught Error: Call to a member function MostrarRuta() on null in /home/arturo/public_html/php/oop/1/index.php:56 Stack trace: #0 {main} thrown in /home/arturo/public_html/php/oop/1/index.php on line 56

22: añado una ruta y la función __construct, y a ver qué tal
... y 23, 24: funciona

27: unas comillas que faltaban al final y resuelto

ESTADO:

<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Reservas bus</title>
</head>

<body>

    <?php

    class bus
    {
        public $matricula;
        public $asientos;
    }


    class ruta
    {
        public $nombre;
        public $precio;
        public $bus;


        function __construct($nombre, $precio, $bus)
        {
            $this->nombre = $nombre;
            $this->precio = $precio;
            $this->bus = $bus;
        }


        function MostrarRuta()
        {
            echo "Ruta: " . $this->nombre . " Precio asiento: " . $this->precio . " Modelo bus: (Pendiente) ";
        }
    }


    $rutas = [];
    $rutas[] = new ruta("Circular", 2, "azul");

    ?>



    <form action="index.php" method="post">
        <select name="proceso">
            <option value="rutas">Gestión de rutas</option>
            <option value="buses">Gestión de autobuses</option>
            <option value="reservas" selected>Reserva de asientos</option>
            <input type="submit" value="Enviar">
        </select>
    </form>

    <?php

    if (isset($_POST['proceso'])) {

        $proceso = $_POST['proceso'];
        if ($proceso == "rutas") {
            echo "<hr><br>Rutas existentes:<br>";
            $rutas[0]->MostrarRuta();
    ?>
            <br><br>
            <form action="index.php" method="post">
                <input type="text" name="nomruta">
                <input type="number" name="prruta">
                <input type="text" name="busruta">
                <input type="submit" value="Enviar">
            </form>

    <?php
            if ((isset($_POST['nomruta'])) &&  (isset($_POST['prruta'])) &&  (isset($_POST['busruta']))) {

                $nuevaruta = new ruta($_POST['nomruta'], $_POST['prruta'], $_POST['busruta']);
                $rutas[] = $nuevaruta;
                $rutas[0]->MostrarRuta();
            }
        }

        if ($proceso == "buses") {
        }

        if ($proceso == "reservas") {
        }
    }

    ?>

</body>

</html>


Por cierto, me quedaría eliminar ruta... para eso también puedo apoyarme en el fichero de ayer, lo pospongo

Supongo que para la gestión de buses habrá que hacer el mismo proceso:

31: errores, antes de adaptar el código pegado de la parte de rutas

32: efectivamente, $bus aquí es una variable no declarada y cambia de tonalidad

34: ah, ok, en la línea 115 habrá que cambiar ruta por bus... 38: correcto, era eso


ESTADO ACTUAL:
<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Reservas bus</title>
</head>

<body>

    <?php

    class bus
    {
        public $matricula;
        public $asientos;

        function __construct($matricula, $asientos)
        {
            $this->matricula = $matricula;
            $this->asientos = $asientos;
            
        }


        function MostrarBus()
        {
            echo "Matrícula: " . $this->matricula . " Número de plazas: " . $this->asientos;
        }

    }


    class ruta
    {
        public $nombre;
        public $precio;
        public $bus;


        function __construct($nombre, $precio, $bus)
        {
            $this->nombre = $nombre;
            $this->precio = $precio;
            $this->bus = $bus;
        }


        function MostrarRuta()
        {
            echo "Ruta: " . $this->nombre . " Precio asiento: " . $this->precio . " Modelo bus: (Pendiente) ";
        }
    }

    $buses = [];
    $buses[] = new bus("Circular", 52);

    $rutas = [];
    $rutas[] = new ruta("Circular", 2, "azul");

    ?>



    <form action="index.php" method="post">
        <select name="proceso">
            <option value="rutas">Gestión de rutas</option>
            <option value="buses">Gestión de autobuses</option>
            <option value="reservas" selected>Reserva de asientos</option>
            <input type="submit" value="Enviar">
        </select>
    </form>

    <?php

    if (isset($_POST['proceso'])) {

        $proceso = $_POST['proceso'];
        if ($proceso == "rutas") {
            echo "<hr><br>Rutas existentes:<br>";
            $rutas[0]->MostrarRuta();
    ?>
            <br><br>
            <form action="index.php" method="post">
                <input type="text" name="nomruta">
                <input type="number" name="prruta">
                <input type="text" name="busruta">
                <input type="submit" value="Enviar">
            </form>

    <?php
            if ((isset($_POST['nomruta'])) &&  (isset($_POST['prruta'])) &&  (isset($_POST['busruta']))) {

                $nuevaruta = new ruta($_POST['nomruta'], $_POST['prruta'], $_POST['busruta']);
                $rutas[] = $nuevaruta;
                $rutas[0]->MostrarRuta();
            }
        }

        if ($proceso == "buses") {

            echo "<hr><br>Buses existentes:<br>";
            $buses[0]->MostrarBus();
    ?>
            <br><br>
            <form action="index.php" method="post">
            <input type="text" name="matbus">
                <input type="number" name="asibus">
            </form>

    <?php
            if ((isset($_POST['matbus'])) &&  (isset($_POST['asibus'])) ) {

                $nuevobus = new bus($_POST['matbus'], $_POST['asibus']);
                $buses[] = $nuevobus;
                $buses[0]->MostrarBus();
            }
        }


        }

        if ($proceso == "reservas") {
        }
    

    ?>

</body>

</html>



(De nuevo quedaría la opción de eliminar, en este caso buses)

Además queda la tercera opción, la de reserva. En ella estarán incluidas las funciones:
Vender asientos
Estado (completo o no)

El estado será una propiedad de la ruta, que es la que nos interesa saber si está completa o no
Los asientos serán un array de 0/1... y en alguna parte irá el bus.
... ok, puedo expresar el estado como asientos disponibles, y simplificamos

Proceso a seguir aquí:
Que te saque listado de rutas con si están disponibles o no (Es decir, si la propiedad asientos disponibles de la ruta es mayor o no que 0)
Al seleccionar la ruta un foreach de asientos, y asociarle un if 0/1 para que te lo pinte según una clase diferente o un style diferente
Al crear una ruta llenar de 0's el array de su bus
Obviamente, que no te deje seleccionar una ruta no disponible
Juntar el conjunto de cuadritos en un grid, para darle forma de bus


Le meto esta consulta a grok y me dice esto:

```html
<!DOCTYPE html>
<html lang="es">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Reservas bus</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 20px;
        }
        .bus-grid {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(48px, 1fr));
            gap: 10px;
            max-width: 700px;
            margin: 20px 0;
            padding: 15px;
            border: 3px solid #333;
            background: #f0f0f0;
            border-radius: 10px;
        }
        .seat {
            width: 48px;
            height: 48px;
            display: flex;
            align-items: center;
            justify-content: center;
            border: 3px solid #333;
            font-weight: bold;
            font-size: 16px;
            background-color: #ddd;
            position: relative;
            border-radius: 6px;
            box-shadow: 2px 2px 4px rgba(0,0,0,0.2);
        }
        .seat.free {
            background-color: #90EE90;
            cursor: pointer;
        }
        .seat.occupied {
            background-color: #FF6666;
            color: white;
            cursor: not-allowed;
        }
        .seat input[type="checkbox"] {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            opacity: 0;
            cursor: pointer;
            z-index: 2;
        }
        .seat.free:hover {
            background-color: #7CFC00;
            transform: scale(1.05);
        }
        hr {
            border: 2px solid #333;
        }
    </style>
</head>

<body>

    <?php

    class bus
    {
        public $matricula;
        public $total_asientos;
        public $estado_asientos;   // 0 = libre, 1 = ocupado

        function __construct($matricula, $asientos)
        {
            $this->matricula = $matricula;
            $this->total_asientos = $asientos;
            $this->estado_asientos = array_fill(0, $asientos, 0); // todos libres al crear
        }

        function MostrarBus()
        {
            echo "Matrícula: " . $this->matricula . " | Plazas: " . $this->total_asientos . 
                 " | Disponibles: " . $this->asientos_disponibles();
        }

        function asientos_disponibles()
        {
            return $this->total_asientos - array_sum($this->estado_asientos);
        }
    }

    class ruta
    {
        public $nombre;
        public $precio;
        public $bus;

        function __construct($nombre, $precio, $bus)
        {
            $this->nombre = $nombre;
            $this->precio = $precio;
            $this->bus = $bus;
        }

        function MostrarRuta()
        {
            echo "Ruta: " . $this->nombre . " | Precio asiento: " . $this->precio . 
                 " | Bus: " . $this->bus->matricula;
        }
    }

    // Datos iniciales
    $buses = [];
    $buses[] = new bus("Circular", 52);

    $rutas = [];
    $rutas[] = new ruta("Circular", 2, $buses[0]);

    ?>

    <form action="index.php" method="post">
        <select name="proceso">
            <option value="rutas">Gestión de rutas</option>
            <option value="buses">Gestión de autobuses</option>
            <option value="reservas" selected>Reserva de asientos</option>
        </select>
        <input type="submit" value="Enviar">
    </form>

    <?php

    if (isset($_POST['proceso'])) {

        $proceso = $_POST['proceso'];

        // ============================================
        // GESTIÓN DE RUTAS
        // ============================================
        if ($proceso == "rutas") {

            // Procesar alta de ruta (ANTES de mostrar lista)
            if (isset($_POST['nomruta']) && isset($_POST['prruta']) && isset($_POST['busruta'])) {
                $bidx = (int)$_POST['busruta'];
                if (isset($buses[$bidx])) {
                    $nuevaruta = new ruta($_POST['nomruta'], (int)$_POST['prruta'], $buses[$bidx]);
                    $rutas[] = $nuevaruta;
                    echo "<p style='color:green;'><strong>✔ Ruta añadida correctamente</strong></p>";
                }
            }

            echo "<hr><br><strong>Rutas existentes:</strong><br>";
            foreach ($rutas as $r) {
                $r->MostrarRuta();
                echo "<br>";
            }
            ?>
            <br><br>
            <form action="index.php" method="post">
                <input type="hidden" name="proceso" value="rutas">
                <input type="text" name="nomruta" placeholder="Nombre de la ruta" required>
                <input type="number" name="prruta" placeholder="Precio asiento" required>
                <select name="busruta" required>
                    <?php foreach ($buses as $k => $b): ?>
                        <option value="<?= $k ?>"><?= $b->matricula ?> (<?= $b->total_asientos ?> plazas)</option>
                    <?php endforeach; ?>
                </select>
                <input type="submit" value="Añadir ruta">
            </form>
            <?php
        }

        // ============================================
        // GESTIÓN DE AUTOBUSES
        // ============================================
        if ($proceso == "buses") {

            // Procesar alta de bus
            if (isset($_POST['matbus']) && isset($_POST['asibus'])) {
                $nuevobus = new bus($_POST['matbus'], (int)$_POST['asibus']);
                $buses[] = $nuevobus;
                echo "<p style='color:green;'><strong>✔ Bus añadido correctamente</strong></p>";
            }

            echo "<hr><br><strong>Buses existentes:</strong><br>";
            foreach ($buses as $b) {
                $b->MostrarBus();
                echo "<br>";
            }
            ?>
            <br><br>
            <form action="index.php" method="post">
                <input type="hidden" name="proceso" value="buses">
                <input type="text" name="matbus" placeholder="Matrícula del bus" required>
                <input type="number" name="asibus" placeholder="Número de asientos" required>
                <input type="submit" value="Añadir bus">
            </form>
            <?php
        }

        // ============================================
        // RESERVA DE ASIENTOS (la opción que pedías)
        // ============================================
        if ($proceso == "reservas") {

            // 1. Vender asientos (procesar POST antes de todo)
            if (isset($_POST['vender']) && isset($_POST['ruta_idx']) && isset($_POST['seats'])) {
                $idx = (int)$_POST['ruta_idx'];
                if (isset($rutas[$idx])) {
                    foreach ($_POST['seats'] as $seat_str) {
                        $seat = (int)$seat_str;
                        $bus = $rutas[$idx]->bus;
                        if (isset($bus->estado_asientos[$seat]) && $bus->estado_asientos[$seat] === 0) {
                            $bus->estado_asientos[$seat] = 1;
                        }
                    }
                    echo "<p style='color:green; font-size:18px;'><strong>✔ Asientos vendidos correctamente</strong></p>";
                }
            }

            // 2. Mostrar listado de rutas con estado (disponible / completa)
            echo "<hr><br><strong>Estado de las rutas:</strong><br>";
            foreach ($rutas as $i => $r) {
                $disp = $r->bus->asientos_disponibles();
                $estado = ($disp > 0) ? "<span style='color:green;'>Disponible</span>" : "<span style='color:red;'>COMPLETA</span>";
                echo $r->nombre . " — " . $estado . " (" . $disp . " asientos libres) — Bus: " . $r->bus->matricula . "<br>";
            }

            // 3. Formulario para elegir ruta (solo rutas con asientos libres)
            ?>
            <br>
            <form action="index.php" method="post">
                <input type="hidden" name="proceso" value="reservas">
                <select name="ruta_seleccionada" required>
                    <?php
                    $hayDisponibles = false;
                    foreach ($rutas as $i => $r) {
                        $disp = $r->bus->asientos_disponibles();
                        if ($disp > 0) {
                            $hayDisponibles = true;
                            echo '<option value="' . $i . '">' . $r->nombre . ' (' . $disp . ' libres)</option>';
                        }
                    }
                    if (!$hayDisponibles) {
                        echo '<option disabled>No hay rutas con asientos disponibles</option>';
                    }
                    ?>
                </select>
                <input type="submit" value="Ver asientos de la ruta">
            </form>
            <?php

            // 4. Si se seleccionó una ruta → mostrar grid + vender
            if (isset($_POST['ruta_seleccionada'])) {
                $idx = (int)$_POST['ruta_seleccionada'];
                if (isset($rutas[$idx])) {
                    $ruta_sel = $rutas[$idx];
                    $bus = $ruta_sel->bus;
                    $disp = $bus->asientos_disponibles();

                    echo "<h2>Ruta seleccionada: " . $ruta_sel->nombre . " — Precio: " . $ruta_sel->precio . " €</h2>";
                    echo "<p><strong>Bus:</strong> " . $bus->matricula . " | Asientos libres: <strong>" . $disp . "</strong></p>";

                    if ($disp == 0) {
                        echo "<p style='color:red;'>Esta ruta está completa.</p>";
                    } else {
                        ?>
                        <form action="index.php" method="post">
                            <input type="hidden" name="proceso" value="reservas">
                            <input type="hidden" name="ruta_idx" value="<?= $idx ?>">
                            <input type="hidden" name="ruta_seleccionada" value="<?= $idx ?>"> <!-- para permanecer en la vista tras vender -->

                            <div class="bus-grid">
                                <?php for ($i = 0; $i < $bus->total_asientos; $i++) : 
                                    $est = $bus->estado_asientos[$i];
                                    $clase = ($est == 0) ? 'free' : 'occupied';
                                ?>
                                    <div class="seat <?= $clase ?>">
                                        <?= $i + 1 ?>
                                        <?php if ($est == 0): ?>
                                            <input type="checkbox" name="seats[]" value="<?= $i ?>">
                                        <?php endif; ?>
                                    </div>
                                <?php endfor; ?>
                            </div>

                            <br>
                            <input type="submit" name="vender" value="Vender asientos seleccionados" 
                                   style="padding:12px 30px; font-size:18px; background:#0066cc; color:white; border:none; border-radius:8px; cursor:pointer;">
                        </form>

                        <p style="font-size:14px; color:#555;">
                            ✅ Haz clic en los asientos verdes para seleccionarlos.<br>
                            Los asientos rojos están ocupados.
                        </p>
                        <?php
                    }
                }
            }
        }
    }

    ?>

</body>
</html>
```

**¿Qué se ha implementado exactamente como pediste?**

- **Estado de la ruta** → calculado automáticamente por `asientos_disponibles()` del bus asociado (simplificado como tú dijiste).
- **Listado de rutas** con “Disponible” (verde) o “Completa” (rojo) según queden asientos libres.
- **Al crear una ruta** → se asocia a un bus existente y ese bus ya viene con todos los asientos a `0` (libres).
- **Seleccionar ruta** → solo aparecen las que tienen asientos libres.
- **Grid de asientos con forma de bus** → cuadrados en grid responsivo (`auto-fit`). Verdes = libres (con checkbox), rojos = ocupados.
- **Vender asientos** → puedes seleccionar varios a la vez (checkbox) y pulsar “Vender”. Se marcan como ocupados al instante.
- Se han corregido los bugs del código original (formularios sin `hidden proceso`, sin `submit`, procesamiento después de mostrar, etc.) para que todo funcione correctamente.

Copia y pega este código completo en tu `index.php`. ¡Ya tienes la tercera opción lista para usar! Si quieres cambiar el número de columnas del grid, colores, o añadir más cosas (por ejemplo, precio total de la reserva), avísame.


https://grok.com/c/acda582b-a025-4f91-8088-1370dbd17b3a?rid=86ae95a1-389f-46c3-836c-21dbb262d432


*** Día 27/02/2026


https://jose.avisando.com/php/poo/buses/index.php


Posiblemente tendremos prácticas getafenses, tal vez en grupos de 3


*** Día 02/03/2026


25: la instrucción new se refiere al método constructor
Podríamos serializar esto y meterlo en una bdd

34 es tras download file

35: el error no se veía por estar en el select

36, 37: tras el include ya entiende el contenido, ya reconoce la clase Bus

46: buses recibe la matrícula de cada bus (48)

50: el break rompe el foreach

Desde 63 buscamos darle una clave exclusiva a cada línea, que es la que sale en 72

68: al borrar el archivo se borran las líneas

79: getBuses nos devuelve un array de buses

129, 130: hay que identificar también los buses

145: un exit para revisar lo que hace
146: no pinta nada, no lo encuentra

154, 153: al cambiar las comillas ya lo asigna de forma correcta

170: esta parte sigue dando problemas

173 a 176: ya funciona... programa finalizado

179, 180: phpmailer es una clase que permite crear objetos de tipo correo

Las clases tienen funciones, métodos y propiedades

181: y esto es un constructor
182: esto es un método

EJERCICIO (que tal vez no nos dé tiempo):
Tabla que pinte un select de una bdd, que la clase genere una tabla para ese select
Que de 200 saque 201, 203...


*** Día 03/03/2026

Tal vez prácticas:
Avenida de las ciudades,, Las margaritas y Juan de la Cierva
En teoría desde NMinisterios la C4 dirección Parla hasta Las Margaritas, es lo que Google Maps dice que es más corto
Revisar el precio del bonotren... ¿en Nuevos Ministerios, por ejemplo?


unsplash.com, web con imágenes
chat.deepseek.com, otra IA, china

El responsable de lo que hay en la web es el propietario


Decíamos "ayer" que si tenemos tablas de productos y categorías, es en la tabla de productos donde tengo que meter la relación.
Los productos pertenecen a categorías, y si borras el producto no se borra la categoría

Los trabajadores tienen pausas
Los trabajadores tienen fichajes
Las pausas están en los fichajes también


Es en la "segunda tabla" donde va la relación
24: Desde una tabla de fichajes asociada a la de trabajadores meto la relación en la de fichajes, que contiene el idtrabajador. Si aquí en "on delete" pongo Restrict no me dejará eliminar trabajadores que tengan registros de fichaje, si aplico Cascade al eliminar trabajadores se eliminarán sus fichajes.

Las instrucciones SQL serían:
ALTER TABLE `conthorario_fichajes` ADD FOREIGN KEY (`idtrabajador`) REFERENCES `conthorario_trabajadores`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT;
ALTER TABLE `conthorario_fichajes` ADD FOREIGN KEY (`idtrabajador`) REFERENCES `conthorario_trabajadores`(`id`) ON DELETE CASCADE ON UPDATE RESTRICT;

Y claro, la relación va en la tabla de fichajes, porque la tabla de fichajes tiene el idtrabajador, pero la tabla de trabajadores no recoge el idintervalo de la tabla de fichajes

25: dejo Cascada, porque la limitación la haré por el usuario que pueda eliminar trabajadores, que no será cualquiera


26: pasando de Cascade a Restrict (no me deja hacer set null porque chack data types (29))
ALTER TABLE `conthorario_trabajadores` DROP FOREIGN KEY `conthorario_trabajadores_ibfk_1`; ALTER TABLE `conthorario_trabajadores` ADD CONSTRAINT `conthorario_trabajadores_ibfk_1` FOREIGN KEY (`id`) REFERENCES `conthorario_fichajes`(`idtrabajador`) ON DELETE RESTRICT ON UPDATE RESTRICT;

27: pues no, esta no se ha alterado, así que entiendo que la otra la creé en su momento y que la puedo borrar


29:
ALTER TABLE `conthorario_trabajadores` DROP FOREIGN KEY `conthorario_trabajadores_ibfk_1`; ALTER TABLE `conthorario_trabajadores` ADD CONSTRAINT `conthorario_trabajadores_ibfk_1` FOREIGN KEY (`id`) REFERENCES `conthorario_fichajes`(`idtrabajador`) ON DELETE SET NULL ON UPDATE SET NULL;

Error creating foreign key on id (check data types)


31: pues sí, te devuelve a la tabla donde estabas antes de la inactividad


https://arturo.avisando.com/bbdd/doc/html/index.html
https://mariadb.com/docs/



El borrado en cascada (ON DELETE CASCADE) en phpMyAdmin elimina automáticamente los registros hijos en tablas relacionadas cuando se borra un registro padre, manteniendo la integridad referencial. Se configura definiendo una clave foránea (Foreign Key) en la tabla secundaria, seleccionando la opción CASCADE en la regla ON DELETE. 
SQL Shack
SQL Shack
 +3

Pasos para configurar Borrado en Cascada en phpMyAdmin
1. Requisitos: Ambas tablas deben usar el motor InnoDB.
2. Tabla Hija: Asegúrate de que la tabla dependiente tenga una columna que referencia a la tabla principal.
3. Vista de Relaciones: Ve a la tabla hija, haz clic en la pestaña Estructura y luego en Vista de relaciones.
4. Configurar Clave Foránea:
Crea una restricción (Constraint).
Selecciona la columna foránea (hija).
Selecciona la base de datos y la tabla principal (padre).
Selecciona la columna primaria (padre).
En ON DELETE, selecciona CASCADE.
5. Guardar: Clic en Guardar. 
SQL Shack
SQL Shack
 +4
Ejemplo de código SQL
sql

ALTER TABLE tabla_hija
ADD CONSTRAINT fk_nombre
FOREIGN KEY (columna_id) 
REFERENCES tabla_padre(id) 
ON DELETE CASCADE;


En mi caso en la tabla de fichajes tengo esto:
ALTER TABLE `conthorario_fichajes`
ADD FOREIGN KEY (`idtrabajador`)
REFERENCES `conthorario_trabajadores`(`id`)
ON DELETE CASCADE ON UPDATE RESTRICT;

Es decir, al montarlo desde conthorario_fichajes la tabla padre es trabajadores y la hija fichajes
Es decir, "elimina automáticamente los registros hijos en tablas relacionadas cuando se borra un registro padre" es:
elimina automáticamente los registros de fichajes en tablas relacionadas cuando se borra un registro de trabajador... Es decir, lo que buscaba.

Y es decir, la relación creada desde la tabla de trabajadores sería al revés, eliminar trabajadores al eliminar fichajes... No tiene sentido, elimino la relación de la tabla de trabajadores, ya he visto antes que es independiente de la de fichajes.
... o no, la dejo pero la paso a restrict, por ejemplo

40: pues venga, a ampliar esta tabla

41:
ALTER TABLE `conthorario_fichajes` ADD `hora_fichaje` TIME NOT NULL AFTER `fecha_fichaje`;
ALTER TABLE `conthorario_fichajes` ADD `idpausa` INT(4) UNSIGNED NOT NULL AFTER `hora_fichaje`;

42:
ALTER TABLE `conthorario_fichajes` ADD UNIQUE(`idpausa`);

46: ALTER TABLE `conthorario_fichajes` ADD FOREIGN KEY (`idpausa`) REFERENCES `conthorario_pausas`(`idpausa`) ON DELETE RESTRICT ON UPDATE RESTRICT;


sql map para sql inject, inyecta instrucciones sql para hacer pentesting, para hacer de forma automática cientos de pruebas de ataque
Lleva a www.kali.org, kali linux

Yo por sql inject llego a https://www.w3schools.com/sql/sql_injection.asp

51:
ALTER TABLE `conthorario_fichajes` ADD `hash` TEXT NOT NULL AFTER `idpausa`;
La collation me la ha puesto automáticamente... pero no coincide con la de la tabla de trabajadores (52). Claro que le he puesto text y no varchar... A ver con un varchar

53: Do you really want to execute "ALTER TABLE `conthorario_fichajes` DROP `hash`;"?
para añadir de nuevo el campo


54: ALTER TABLE `conthorario_fichajes` ADD `hash` VARCHAR(50) NOT NULL AFTER `idpausa`;
Los de utf8 no van a dar problemas, contienen la ñ y otros símbolos... pero hay que usar el mismo tipo y subtipo en todos, así que cambiaré este que me ha puesto por defecto por el que uso en los otros

55: ALTER TABLE `conthorario_fichajes` CHANGE `hash` `hash` VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;


*** Día 04/03/2026

Es cierto, me queda la tabla de usuarios... le hago un copy table with prefix

20: CREATE TABLE `arturo`.`conthorario_usuarios` ( `id` int(10) UNSIGNED NOT NULL, `nombre` varchar(250) NOT NULL, `mail` varchar(250) NOT NULL, `pass` varchar(50) NOT NULL, `activo` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '0 no activo, 1 activo', `clave` char(150) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; ALTER TABLE `arturo`.`conthorario_usuarios` ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `mail` (`mail`), ADD UNIQUE KEY `clave` (`clave`), ADD KEY `activo` (`activo`); ALTER TABLE `arturo`.`conthorario_usuarios` MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT; SET SQL_MODE='NO_AUTO_VALUE_ON_ZERO'; INSERT INTO `arturo`.`conthorario_usuarios`(`id`, `nombre`, `mail`, `pass`, `activo`, `clave`) SELECT `id`, `nombre`, `mail`, `pass`, `activo`, `clave` FROM `arturo`.`usuarios`;


21 a 23:
ALTER TABLE `conthorario_usuarios` CHANGE `activo` `activo` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0' COMMENT '0 no activo, 1 admin, 2 trabajadores, 3 inspectores';

ALTER TABLE `conthorario_usuarios` CHANGE `activo` `tipo` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0' COMMENT '0 no activo, 1 admin, 2 trabajadores, 3 inspectores';



Indicar teletrabajo
Acceso al historial de los últimos 4 años
40: exportable a pdf, csv, json
42: sólo el empleado puede tocar su historial



Para cambiar entre pestañas en el Bloc de notas (Windows 11), utiliza Ctrl + Tab para avanzar a la siguiente pestaña y Ctrl + Mayús (Shift) + Tab para retroceder a la anterior. También puedes usar Ctrl + [Número] (del 1 al 8) para ir a una pestaña específica y Ctrl + 9 para la última. 
TikTok
TikTok
 +3
Siguiente pestaña: Ctrl + Tab.
Pestaña anterior: Ctrl + Mayús + Tab.
Ir a pestaña específica: Ctrl + 1-9.
Cerrar pestaña actual: Ctrl + W.
Abrir nueva pestaña: Ctrl + N. 
TikTok
TikTok
 +4
Estos atajos funcionan en la versión moderna del Bloc de notas en Windows 11 que permite pestañas. 


*** Día 05/03/2026

create table if not exists <tabla>
index idx_... {campo}


59: https://developer.mozilla.org/es/docs/Web/API/Element/remove

61:
El borrado en cascada (ON DELETE CASCADE) en phpMyAdmin elimina automáticamente los registros hijos en tablas relacionadas cuando se borra un registro padre, manteniendo la integridad referencial. Se configura definiendo una clave foránea (Foreign Key) en la tabla secundaria, seleccionando la opción CASCADE en la regla ON DELETE. 
SQL Shack
SQL Shack
 +3
Pasos para configurar Borrado en Cascada en phpMyAdmin
Requisitos: Ambas tablas deben usar el motor InnoDB.
Tabla Hija: Asegúrate de que la tabla dependiente tenga una columna que referencia a la tabla principal.
Vista de Relaciones: Ve a la tabla hija, haz clic en la pestaña Estructura y luego en Vista de relaciones.
Configurar Clave Foránea:
Crea una restricción (Constraint).
Selecciona la columna foránea (hija).
Selecciona la base de datos y la tabla principal (padre).
Selecciona la columna primaria (padre).
En ON DELETE, selecciona CASCADE.
Guardar: Clic en Guardar. 
SQL Shack
SQL Shack
 +4
Ejemplo de código SQL
sql
ALTER TABLE tabla_hija
ADD CONSTRAINT fk_nombre
FOREIGN KEY (columna_id) 
REFERENCES tabla_padre(id) 
ON DELETE CASCADE;




 You have been automatically logged out due to inactivity of 1440 seconds. Once you log in again, you should be able to resume the work where you left off.


https://www.php.net/manual/es/control-structures.elseif.php


*** Día 06/03/2026

Ayer antes del desayuno pentesting VS certificación
Después lo de demo.ifichar.com

https://european-union.europa.eu/institutions-law-budget/institutions-and-bodies/search-all-eu-institutions-and-bodies/european-high-performance-computing-joint-undertaking-eurohpc-ju_es


El tema de nube tiene empleabilidad, aunque es más de Sistemas, y AWS ahora tiene más posibilidades que Azure
También podemos estudiar frameworks como Larable, framework de PHP,...


---
Desde:
view-source:https://www.msn.com/es-es/motor/noticias/las-torres-kio-inclinadas-sobre-plaza-de-castilla-en-madrid/vi-AA1XiguW?ocid=msedgntp&pc=LCTS&cvid=69aad4f0f2c34bd9b815116325dc8412&ei=43


{&quot;n&quot;:&quot;Player&quot;,&quot;t&quot;:61,&quot;a&quot;:&quot;click&quot;,&quot;b&quot;:57,&quot;ext&quot;:{&quot;videoCs&quot;:&quot;AA1XiguW&quot;,&quot;videoFormatCode&quot;:1006,&quot;title&quot;:&quot;Las Torres KIO inclinadas sobre Plaza de Castilla en Madrid&quot;,&quot;videoDuration&quot;:370,&quot;playerInstanceId&quot;:&quot;vjs_video_3_html5_api&quot;,&quot;playType&quot;:&quot;pb&quot;,&quot;playerTech&quot;:&quot;HTML5&quot;,&quot;pluginVersion&quot;:&quot;HTML5&quot;,&quot;size&quot;:&quot;688x387&quot;,&quot;videoPlayerType&quot;:&quot;mp4:progressive&quot;,&quot;playerType&quot;:&quot;HTML5&quot;,&quot;videoUrl&quot;:&quot;https://prod-streaming-video-msn-com.akamaized.net/v1/eus002/6ec6171c-da62-4b8d-b379-aa10adf1e0ff/6cd1dd40-866c-4020-9276-895cc00b2d7e.m3u8&quot;}}


https://prod-streaming-video-msn-com.akamaized.net/v1/eus002/6ec6171c-da62-4b8d-b379-aa10adf1e0ff/6cd1dd40-866c-4020-9276-895cc00b2d7e.m3u8

---


https://us06web.zoom.us/postattendee?mn=fGNyvB5toBX-K5tkdxgtoM9p6Dz6hR2acZzP.SNQPpu7J1iI5WVWN

https://european-union.europa.eu/institutions-law-budget/institutions-and-bodies/search-all-eu-institutions-and-bodies/european-high-performance-computing-joint-undertaking-eurohpc-ju_es

https://campusfp.es/campusfp-vistalegre/


*** Día 09/03/2026

Aplicar tókenes para cada acción para que las acciones estén individualizadas y no se puedan copiar por curl
Ver sql inject para evitarlo


*** Día 10/03/2026

Administración de servidores ayuda con Azure


SEN27-INFORME DE PRUEBA PRAC TICA
CÓDIGO CURSO: FDEC240004454 ANO PROGRAMACIÓN: 2024 PROGRAMA FORMATIVO: FDEC EXPEDIENTE: ACCIÓN: GRUPO: NOMBRE ACCIÓN FORMATIVA: IFCD0111 PROGRAMACIÓN DE LENGUAJES ESTRUCTURADOS DE APLICACIONES DE GESTIÓN FECHAS DE IMPARTICIÓN: 1/10/2025-12/03/2026 CENTRO DE FORMACIÓNENTIDAD FUNDACIÓN DEL LESIONADO MEDULAR CENSO: 27903
Se incorporará un apartado por cada uno de los módulos o unidades formativas a describir y que componen la unidad formativa:
MÓDULO FORMATIVO o UNIDAD FORMATIVA Código MF0494_3/ Denominación: Programación en lenguajes estructurados MF/UF: UF2178 Programación estructurada, UF2179 Elaboración de Interfaces de usuario UF2180 Acceso a bases de datos UF2181 Elaboración de pruebas e instalación y despliegue de aplicaciones
Formador/a o responsable: ALFONSO JAVIER GIL LLAMAS
1) Creación de lista de la compra familiar 2) Objetivos especficos a los que responde la practica (capacidades) Valorar las destrezas prácticas 3) Definición de la práctica: ◦ Descripción:

Crear un sistema de gestión de puntos de cliente para tiendas El sistema debe permitir agregar clientes...se debe pedir el DNI, fecha de nacimiento, nombre, teléfono y correo. El sistema debe permitir editar clientes. Una vez añadido el cliente, cuando el cliente compra en la tienda, el sistema debe permitir buscar clientes por dni y/o teléfono, una vez encontrado se le puede añadir puntos que se suman a los puntos que el cliente ya tenga, por ejemplo el 2% de cada cada compra. Y al mismo tiempo cuando el cliente estime se podría restas puntos, cuando un cliente quiere hacer uso de sus puntos... la cantidad que estime será restada... imaginemos que los puntos se trasforman en dinero de descuento en otras compras o regalos.

Lo deberá colgar en su servidor en un directorio llamado "exámenes" que cuelgue del raiz, dentro de otra carpeta Ilamada ""... por ejemplo: https://tunombre.quiaviaje.com/examenes/3/
○ Medios para su realización: Equipos de clase, internet y servidor cloud Instrucciones: ○ Duración: 4:30h
4) Evaluación de la práctica (Lista de verificación u Hoja de evaluación)
SEN27 Informe de Prueba Práctica ACTUALIZADO Febrero 2023
Modelo 2202FO35



En Python:

import datetime

# Dictionary to store customers: key is DNI, value is a dict with details
customers = {}

def validate_dni(dni):
    """Simple DNI validation: assuming it's a string of 8 digits + letter, but for simplicity, just check if not empty."""
    return bool(dni.strip())

def validate_date(dob):
    """Validate date in YYYY-MM-DD format."""
    try:
        datetime.datetime.strptime(dob, '%Y-%m-%d')
        return True
    except ValueError:
        return False

def add_customer():
    print("\nAgregar nuevo cliente:")
    dni = input("DNI: ").strip()
    if not validate_dni(dni):
        print("DNI inválido.")
        return
    if dni in customers:
        print("Cliente con este DNI ya existe.")
        return
    
    dob = input("Fecha de nacimiento (YYYY-MM-DD): ").strip()
    if not validate_date(dob):
        print("Fecha inválida.")
        return
    
    name = input("Nombre: ").strip()
    phone = input("Teléfono: ").strip()
    email = input("Correo: ").strip()
    
    customers[dni] = {
        'dob': dob,
        'name': name,
        'phone': phone,
        'email': email,
        'points': 0
    }
    print("Cliente agregado exitosamente.")

def edit_customer():
    print("\nEditar cliente:")
    dni = input("DNI del cliente a editar: ").strip()
    if dni not in customers:
        print("Cliente no encontrado.")
        return
    
    print("Deje en blanco para no cambiar el campo.")
    dob = input(f"Fecha de nacimiento actual ({customers[dni]['dob']}): ").strip() or customers[dni]['dob']
    if dob != customers[dni]['dob'] and not validate_date(dob):
        print("Fecha inválida. No se cambia.")
        dob = customers[dni]['dob']
    
    name = input(f"Nombre actual ({customers[dni]['name']}): ").strip() or customers[dni]['name']
    phone = input(f"Teléfono actual ({customers[dni]['phone']}): ").strip() or customers[dni]['phone']
    email = input(f"Correo actual ({customers[dni]['email']}): ").strip() or customers[dni]['email']
    
    customers[dni].update({
        'dob': dob,
        'name': name,
        'phone': phone,
        'email': email
    })
    print("Cliente actualizado.")

def search_customer(dni=None, phone=None):
    results = []
    for key, value in customers.items():
        if (dni and key == dni) or (phone and value['phone'] == phone):
            results.append((key, value))
    return results

def add_points():
    print("\nAñadir puntos por compra:")
    search_dni = input("DNI (opcional): ").strip()
    search_phone = input("Teléfono (opcional): ").strip()
    
    results = search_customer(search_dni, search_phone)
    if not results:
        print("No se encontró cliente.")
        return
    elif len(results) > 1:
        print("Múltiples resultados. Especifique mejor.")
        return
    
    dni, customer = results[0]
    try:
        purchase_amount = float(input("Monto de la compra: "))
        points_to_add = int(purchase_amount * 0.02)  # 2% como puntos, asumiendo 1 punto = 1 unidad
        customer['points'] += points_to_add
        print(f"Se añadieron {points_to_add} puntos. Total ahora: {customer['points']}")
    except ValueError:
        print("Monto inválido.")

def subtract_points():
    print("\nRestar puntos por uso:")
    search_dni = input("DNI (opcional): ").strip()
    search_phone = input("Teléfono (opcional): ").strip()
    
    results = search_customer(search_dni, search_phone)
    if not results:
        print("No se encontró cliente.")
        return
    elif len(results) > 1:
        print("Múltiples resultados. Especifique mejor.")
        return
    
    dni, customer = results[0]
    try:
        points_to_subtract = int(input("Puntos a restar: "))
        if points_to_subtract > customer['points']:
            print("Puntos insuficientes.")
            return
        customer['points'] -= points_to_subtract
        print(f"Se restaron {points_to_subtract} puntos. Total ahora: {customer['points']}")
        # Aquí se podría calcular el descuento: por ejemplo, 1 punto = 0.01 EUR de descuento, pero como es imaginario, lo omito.
    except ValueError:
        print("Cantidad inválida.")

def view_customer():
    print("\nVer cliente:")
    search_dni = input("DNI (opcional): ").strip()
    search_phone = input("Teléfono (opcional): ").strip()
    
    results = search_customer(search_dni, search_phone)
    if not results:
        print("No se encontró cliente.")
        return
    
    for dni, customer in results:
        print(f"DNI: {dni}")
        print(f"Nombre: {customer['name']}")
        print(f"Fecha de nacimiento: {customer['dob']}")
        print(f"Teléfono: {customer['phone']}")
        print(f"Correo: {customer['email']}")
        print(f"Puntos: {customer['points']}")
        print("---")

def main_menu():
    while True:
        print("\nSistema de Gestión de Puntos de Clientes")
        print("1. Agregar cliente")
        print("2. Editar cliente")
        print("3. Añadir puntos por compra")
        print("4. Restar puntos por uso")
        print("5. Ver cliente y puntos")
        print("6. Salir")
        
        choice = input("Elija una opción: ").strip()
        
        if choice == '1':
            add_customer()
        elif choice == '2':
            edit_customer()
        elif choice == '3':
            add_points()
        elif choice == '4':
            subtract_points()
        elif choice == '5':
            view_customer()
        elif choice == '6':
            print("Saliendo...")
            break
        else:
            print("Opción inválida.")

if __name__ == "__main__":
    main_menu()


SEGUNDA PREGUNTA A GROK:
PHP
<?php
// config.php - Database configuration
$servername = "localhost";
$username = "root"; // Change to your DB username
$password = ""; // Change to your DB password
$dbname = "customer_points";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}
?>


PHP
<?php
// create_db.php - Run this once to create the database and table
include 'config.php';

// Create database if not exists
$sql_db = "CREATE DATABASE IF NOT EXISTS $dbname";
$conn->query($sql_db);

// Select the database
$conn->select_db($dbname);

// Create customers table
$sql_table = "CREATE TABLE IF NOT EXISTS customers (
    id INT AUTO_INCREMENT PRIMARY KEY,
    dni VARCHAR(20) NOT NULL UNIQUE,
    dob DATE NOT NULL,
    name VARCHAR(100) NOT NULL,
    phone VARCHAR(20) NOT NULL,
    email VARCHAR(100) NOT NULL,
    points DECIMAL(10,2) DEFAULT 0.00
)";
$conn->query($sql_table);

echo "Database and table created successfully.";
$conn->close();
?>


HTML

<!-- index.html - Main menu -->
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Sistema de Gestión de Puntos de Clientes</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body>
    <h1>Sistema de Gestión de Puntos</h1>
    <ul>
        <li><a href="add_customer.php">Agregar Cliente</a></li>
        <li><a href="edit_customer.php">Editar Cliente</a></li>
        <li><a href="manage_points.php">Gestionar Puntos (Buscar, Añadir/Restar)</a></li>
    </ul>
</body>
</html>


PHP
<?php
// add_customer.php - Form to add a customer
include 'config.php';

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $dni = $_POST['dni'];
    $dob = $_POST['dob'];
    $name = $_POST['name'];
    $phone = $_POST['phone'];
    $email = $_POST['email'];

    $sql = "INSERT INTO customers (dni, dob, name, phone, email) VALUES ('$dni', '$dob', '$name', '$phone', '$email')";

    if ($conn->query($sql) === TRUE) {
        echo "Cliente agregado exitosamente.";
    } else {
        echo "Error: " . $sql . "<br>" . $conn->error;
    }
}
$conn->close();
?>

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Agregar Cliente</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body>
    <h1>Agregar Nuevo Cliente</h1>
    <form method="post" action="">
        <label>DNI:</label><input type="text" name="dni" required><br>
        <label>Fecha de Nacimiento:</label><input type="date" name="dob" required><br>
        <label>Nombre:</label><input type="text" name="name" required><br>
        <label>Teléfono:</label><input type="text" name="phone" required><br>
        <label>Correo:</label><input type="email" name="email" required><br>
        <input type="submit" value="Agregar">
    </form>
    <a href="index.html">Volver</a>
</body>
</html>


PHP
<?php
// edit_customer.php - Form to edit a customer
include 'config.php';

$customer = null;
if (isset($_GET['dni'])) {
    $dni = $_GET['dni'];
    $sql = "SELECT * FROM customers WHERE dni='$dni'";
    $result = $conn->query($sql);
    if ($result->num_rows > 0) {
        $customer = $result->fetch_assoc();
    }
}

if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['update'])) {
    $dni = $_POST['dni'];
    $dob = $_POST['dob'];
    $name = $_POST['name'];
    $phone = $_POST['phone'];
    $email = $_POST['email'];

    $sql = "UPDATE customers SET dob='$dob', name='$name', phone='$phone', email='$email' WHERE dni='$dni'";

    if ($conn->query($sql) === TRUE) {
        echo "Cliente actualizado exitosamente.";
    } else {
        echo "Error: " . $sql . "<br>" . $conn->error;
    }
}
$conn->close();
?>

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Editar Cliente</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body>
    <h1>Editar Cliente</h1>
    <form method="get" action="">
        <label>Buscar por DNI:</label><input type="text" name="dni" required>
        <input type="submit" value="Buscar">
    </form>

    <?php if ($customer): ?>
    <form method="post" action="">
        <input type="hidden" name="dni" value="<?php echo $customer['dni']; ?>">
        <label>Fecha de Nacimiento:</label><input type="date" name="dob" value="<?php echo $customer['dob']; ?>" required><br>
        <label>Nombre:</label><input type="text" name="name" value="<?php echo $customer['name']; ?>" required><br>
        <label>Teléfono:</label><input type="text" name="phone" value="<?php echo $customer['phone']; ?>" required><br>
        <label>Correo:</label><input type="email" name="email" value="<?php echo $customer['email']; ?>" required><br>
        <input type="submit" name="update" value="Actualizar">
    </form>
    <?php endif; ?>
    <a href="index.html">Volver</a>
</body>
</html>


PHP
<?php
// manage_points.php - Search customer and manage points
include 'config.php';

$customers = [];
$action_message = "";
if (isset($_GET['search'])) {
    $dni = $_GET['dni'] ?? '';
    $phone = $_GET['phone'] ?? '';

    $where = [];
    if ($dni) $where[] = "dni LIKE '%$dni%'";
    if ($phone) $where[] = "phone LIKE '%$phone%'";

    $sql = "SELECT * FROM customers";
    if (!empty($where)) $sql .= " WHERE " . implode(" AND ", $where);
    $result = $conn->query($sql);
    while ($row = $result->fetch_assoc()) {
        $customers[] = $row;
    }
}

if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['add_points'])) {
    $id = $_POST['id'];
    $purchase_amount = $_POST['purchase_amount'];
    $points_to_add = $purchase_amount * 0.02; // 2% of purchase

    $sql = "UPDATE customers SET points = points + $points_to_add WHERE id=$id";
    if ($conn->query($sql) === TRUE) {
        $action_message = "Puntos añadidos: $points_to_add";
    } else {
        $action_message = "Error: " . $conn->error;
    }
}

if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['subtract_points'])) {
    $id = $_POST['id'];
    $points_to_subtract = $_POST['points_to_subtract'];

    $sql = "UPDATE customers SET points = points - $points_to_subtract WHERE id=$id AND points >= $points_to_subtract";
    if ($conn->query($sql) === TRUE && $conn->affected_rows > 0) {
        $action_message = "Puntos restados: $points_to_subtract";
    } else {
        $action_message = "Error: Puntos insuficientes o error en la operación.";
    }
}
$conn->close();
?>

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Gestionar Puntos</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body>
    <h1>Buscar y Gestionar Puntos</h1>
    <form method="get" action="">
        <label>DNI:</label><input type="text" name="dni"><br>
        <label>Teléfono:</label><input type="text" name="phone"><br>
        <input type="submit" name="search" value="Buscar">
    </form>

    <?php if (!empty($customers)): ?>
    <h2>Clientes Encontrados:</h2>
    <?php foreach ($customers as $customer): ?>
    <div class="customer">
        <p><strong>DNI:</strong> <?php echo $customer['dni']; ?></p>
        <p><strong>Nombre:</strong> <?php echo $customer['name']; ?></p>
        <p><strong>Puntos Actuales:</strong> <?php echo $customer['points']; ?></p>

        <form method="post" action="">
            <input type="hidden" name="id" value="<?php echo $customer['id']; ?>">
            <label>Monto de Compra (para añadir 2% como puntos):</label>
            <input type="number" step="0.01" name="purchase_amount" required>
            <input type="submit" name="add_points" value="Añadir Puntos">
        </form>

        <form method="post" action="">
            <input type="hidden" name="id" value="<?php echo $customer['id']; ?>">
            <label>Puntos a Restar:</label>
            <input type="number" step="0.01" name="points_to_subtract" required>
            <input type="submit" name="subtract_points" value="Restar Puntos">
        </form>
    </div>
    <?php endforeach; ?>
    <?php endif; ?>

    <?php if ($action_message): ?>
    <p><?php echo $action_message; ?></p>
    <?php endif; ?>
    <a href="index.html">Volver</a>
</body>
</html>


CSS
/* styles.css - Basic CSS styling */
body {
    font-family: Arial, sans-serif;
    margin: 20px;
}

h1, h2 {
    color: #333;
}

form {
    margin-bottom: 20px;
}

input[type="text"], input[type="date"], input[type="email"], input[type="number"] {
    width: 200px;
    margin-bottom: 10px;
}

input[type="submit"] {
    background-color: #4CAF50;
    color: white;
    border: none;
    padding: 10px;
    cursor: pointer;
}

.customer {
    border: 1px solid #ddd;
    padding: 10px;
    margin-bottom: 20px;
}

a {
    display: block;
    margin-top: 20px;
    color: #007BFF;
    text-decoration: none;
}


Este es un sistema básico de gestión de puntos de clientes implementado en PHP con CSS para el estilo.

Ejecuta create_db.php una vez para crear la base de datos y la tabla (asegúrate de configurar las credenciales en config.php).
Accede a index.html como página principal.
Nota: Este es un ejemplo simple. En producción, usa prepared statements para evitar SQL injection, agrega validaciones, y considera un framework como Laravel para algo más robusto. Los puntos se manejan como decimales para precisión.


Venía de:
Crear en php-css un sistema de gestión de puntos de cliente para tiendas El sistema debe permitir agregar clientes...se debe pedir el DNI, fecha de nacimiento, nombre, teléfono y correo. El sistema debe permitir editar clientes. Una vez añadido el cliente, cuando el cliente compra en la tienda, el sistema debe permitir buscar clientes por dni y/o teléfono, una vez encontrado se le puede añadir puntos que se suman a los puntos que el cliente ya tenga, por ejemplo el 2% de cada cada compra. Y al mismo tiempo cuando el cliente estime se podría restas puntos, cuando un cliente quiere hacer uso de sus puntos... la cantidad que estime será restada... imaginemos que los puntos se trasforman en dinero de descuento en otras compras o regalos.




¿hay billetes de 10 viajes de cercanías en Madrid? Si es que sí dime el precio


Sí, en **Cercanías Madrid** (Renfe) existe un título multiviaje llamado **Abono 10 Viajes** o **Bonotren**, que permite realizar hasta 10 viajes (ida o vuelta indistintamente) en un trayecto específico dentro de las zonas elegidas. Es multipersonal (lo pueden usar varias personas) y tiene validez de un año desde la compra/activación.

El precio **no es fijo** como en Metro o autobuses, sino que **varía según el número de zonas** del trayecto (origen-destino). Las tarifas actuales (vigentes en 2026) para el Bonotren son las siguientes:

- 1/2 zonas: **10,00 €**  
- 3 zonas: **13,70 €**  
- 4 zonas: **18,55 €**  
(En la web oficial de Renfe Cercanías Madrid aparecen estos precios para el Bonotren estándar. Para más zonas o Zona Verde, suelen escalar proporcionalmente, pero consulta tu trayecto concreto.)

Desde 2026 hay descuentos bonificados en algunos casos (por ejemplo, un 40% en ciertas modalidades para viajeros frecuentes), pero el Bonotren clásico (sin bonificación adicional) mantiene precios como los indicados.

Para saber el precio exacto de tu trayecto específico, lo mejor es:  
- Entrar en la web oficial de Renfe Cercanías Madrid → Tarifas → Abonos → Bonotren  
- O usar el buscador de billetes en renfe.com o la app, seleccionando la opción de abono 10 viajes.

Si me dices cuántas zonas tiene tu trayecto habitual (por ejemplo, de Atocha a Alcalá de Henares son 3 zonas), te puedo orientar mejor con el precio aproximado. 😊


el trayecto es de Nuevos Ministerios a Las Margaritas

Sí, el trayecto de **Nuevos Ministerios** a **Las Margaritas Universidad** (en la línea C-4 de Cercanías Madrid, dirección sur hacia Parla) cruza **3 zonas tarifarias** (de zona 0/A a B1, pasando por A y B1).

- Nuevos Ministerios está en zona **0/A** (centro de Madrid).
- Las Margaritas Universidad está en zona **B1** (sur, Getafe área).
- El trayecto pasa por estaciones como Sol, Atocha, Villaverde Bajo/Alto (zona A), hasta entrar en B1 en Getafe Centro y Las Margaritas.

Por tanto, el **Bonotren (Abono 10 Viajes)** para este trayecto cuesta **13,70 €** (precio estándar para 3 zonas, vigente en 2026 según la web oficial de Renfe Cercanías Madrid).

Recuerda:
- Es multipersonal (varias personas pueden usarlo en el mismo tren).
- Validez de 1 año desde la compra/activación.
- Hasta 10 viajes (ida o vuelta indistintamente) en ese trayecto específico (o cualquier dentro de las 3 zonas, pero se carga por el origen-destino máximo).
- No aplica a Zona Verde (C-9).

Hay una versión bonificada del Abono 10 Viajes con **40% de descuento** en algunos casos para viajeros frecuentes (a partir de 2026), pero el precio base del Bonotren clásico es el de 13,70 € para 3 zonas. Si viajas mucho, mira si cumples requisitos para el bonificado (puede bajar a unos 8,22 € aprox.).

Para confirmarlo al 100% o comprarlo:
- En la app Renfe o web renfe.com → Cercanías → Tarifas → Bonotren.
- O en máquinas/taquillas de cualquier estación.

Si necesitas el precio de ida/vuelta sencillo (para comparar): sería 1,85 € por viaje en 3 zonas. ¡Con el Bonotren ahorras bastante si haces varios! 😊


https://grok.com/c/0bbfa805-9f1b-4d4f-8f43-f1d190f23fa6?rid=a54c4f96-2ecf-4baf-8930-6584b3e96ea5
https://grok.com/c/5623cbad-320b-4834-af80-78793b2fd812?rid=ae70572c-e605-4e05-b32d-98a3a757995b
https://martinearth.es/


se puede comprar el bonotren de cercanías en nuevos ministerios?

Sí, **se puede comprar el Bonotren de Cercanías** en la estación de **Nuevos Ministerios**.

El Bonotren (el bono de 10 viajes para Cercanías Madrid) se vende en:

- **Taquillas** (ventanillas de atención al cliente) de las estaciones de Cercanías.
- **Máquinas autoventa** (las máquinas expendedoras automáticas que hay en las estaciones).

Nuevos Ministerios es una estación importante de Cercanías Madrid (con líneas C-1, C-2, C-3, C-4, C-7, C-8 y C-10), por lo que cuenta con taquillas y máquinas autoventa donde se pueden adquirir estos títulos multiviaje, como confirma la información oficial de Renfe.

También puedes comprarlo online en renfe.com o a través de la app de Renfe Cercanías (si está disponible para este título), pero en la estación directamente sí es posible.

Ten en cuenta que a fecha de marzo 2026, el Bonotren sigue siendo un título disponible (aunque hay nuevos abonos bonificados para viajeros frecuentes desde enero 2026), y se adquiere en los puntos habituales de las estaciones. Si vas a la estación, lo encontrarás sin problema.

https://grok.com/c/d7bda586-939e-46d2-942e-9b24187f7670?rid=8dca2b33-4de2-492e-83e7-d18391facdd4


Respondiendo a mi duda:
abrir puertos 80 y 443 de mi router por si quiero saltarme clouding
la cuestión es si mi ip cambia


if ($_SERVER["REQUEST_METHOD"] == "POST") {

La instrucción if ($_SERVER["REQUEST_METHOD"] == "POST") en PHP significa: "Si la solicitud HTTP actual es de tipo POST, ejecuta el siguiente código". 
es.eitca.org
es.eitca.org
Es una comprobación de seguridad y flujo utilizada comúnmente para determinar si un formulario ha sido enviado al servidor. 
Google Groups
Google Groups
Aquí desglose detallado:
$_SERVER: Es una variable superglobal que contiene información sobre el entorno del servidor web, cabeceras y rutas de script.
"REQUEST_METHOD": Es un índice dentro de ese array que indica qué método HTTP se utilizó para acceder a la página (GET, POST, etc.).
== "POST": Compara si el método de la solicitud es, efectivamente, POST. 
PHP
PHP
 +3

¿Para qué se usa?
Se utiliza principalmente para manejar la interacción con formularios HTML. Permite separar la lógica:
Mostrar el formulario (cuando el usuario entra por primera vez, usualmente GET).
Procesar los datos (cuando el usuario hace clic en "Enviar" o submit, se convierte en POST). 
es.eitca.org
es.eitca.org
 +1

Ejemplo práctico
php
<?php
// Comprobamos si los datos han sido enviados vía POST
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    // Procesar los datos (por ejemplo, guardar en base de datos)
    $nombre = $_POST['nombre'];
    echo "Hola, " . $nombre;
} else {
    // Mostrar el formulario por primera vez
    echo '<form method="POST" action="">
            <input type="text" name="nombre">
            <input type="submit" value="Enviar">
          </form>';
}
?>

Por qué usarla

Seguridad: Evita que se ejecute código de procesamiento de datos por error (por ejemplo, si alguien recarga la página o accede directamente a ella sin enviar datos).

Organización: Permite tener el formulario HTML y el código PHP que lo procesa en un mismo archivo.

Diferencia de GET: A diferencia de GET, los datos enviados mediante POST no se muestran en la URL, lo que lo hace más seguro y adecuado para formularios. 
Stack Overflow
Stack Overflow
 +1


51: es el resultado del código que me ha dado Grok

52 a 54: si no me equivoco esto es de las otras virtuales, que reviso para ver si tienen clave, porque si tienen clave no son accesibles. Y sí, tenían clave, perfecto


*** Día 11/03/2026

pwa generator... en el index tenemos el link al fichero manifest, que está en formato json y que llama al grupo de iconos generado para cada dispositivo
web workers, para los procesos en segundo plano, por ejemplo para las notificaciones

8: el favicon que se genera
13: espacio que queda tras eliminar las virtuales

https://www.datacenterdynamics.com/es/noticias/meta-acelera-su-mega-campus-de-datos-en-talavera-al-entrar-en-fase-clave-de-reparcelaci%C3%B3n/


%USERPROFILE%\AppData\Local\Google\Chrome\User Data\Default\Web Applications\_crx_ihbnljcdpbihbdblebnbndmpimgbpode\iFichar.ico





